假装在任何命令的bash中都是tty

Pretend to be a tty in bash for any command

本问题已经有最佳答案,请猛点这里访问。

每当我使用grep并将其传输到其他程序时,不考虑--color选项。我知道我可以使用--color=always,但它也提供了一些其他的命令,我希望得到该命令的确切输出,就像我在tty中得到的输出一样。

所以我的问题是,是否可以欺骗一个命令,让它认为该命令是在tty中运行的?

例如,运行

1
2
grep --color word file # Outputs some colors
grep --color word file | cat # Doesn't output any colors

我想写些东西,比如:

1
IS_TTY=TRUE grep --color word file | cat  # Outputs some colors

这个问题似乎有一个工具可以做我想做的事情:在伪终端(pty)下空运行进程和应用程序,但从我在文档中可以看到的内容来看,我不确定它是否可以帮助解决我的问题。


有许多选项,如其他几个堆栈溢出答案所概述的(请参阅Caarlos的注释)。不过,我将在这里总结一下:

  • 使用scriptprintf,不需要额外的依赖:

    1
    0<&- script -qefc"ls --color=auto" /dev/null | cat

    或者生成bash函数faketty来封装它:

    1
    2
    3
    4
    faketty () {
        script -qfce"$(printf"%q""$@")"
    }
    faketty ls --color=auto | cat

    或者在鱼壳里:

    1
    2
    3
    4
    function faketty
        script -qefc"(printf"%q""$argv")"
    end
    faketty ls --color=auto | cat

    (这是我们的答案)

    http://linux.die.net/man/1/script/脚本

  • 使用unbuffer命令(作为expect命令套件的一部分),不幸的是,这需要50MB以上的安装,但这是最简单的解决方案:

    1
    2
    sudo apt-get install expect-dev
    unbuffer -p ls --color=auto | cat

    或者如果你用鱼壳:

    1
    2
    3
    4
    function faketty
        unbuffer -p $argv
    end
    faketty ls --color=auto | cat

    http://linux.die.net/man/1/unbuffer

  • 这是一篇关于tty如何工作以及伪tty(pty)是什么的很好的文章,如果您想了解Linuxshell如何使用文件描述符传递输入、输出和信号,那么值得一看。http://www.linusakeson.net/programming/tty/index.php