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

时间:2015-10-02 15:28:52

标签: bash tty

每当我使用grep并将其传播到其他程序时,--color选项都不受尊重。我知道我可以使用--color=always,但它还提供了一些其他命令,我想获得该命令的确切输出,如果我在tty中,我会得到输出。

所以我的问题是,是否有可能欺骗命令以认为该命令是在tty内运行的?

例如,运行

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

我希望能够写出类似的内容:

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

This question似乎有一个可以做我想要的工具:empty - run processes and applications under pseudo-terminal (PTY),但是根据我在文档中可以阅读的内容,我不确定它对我的问题有帮助

1 个答案:

答案 0 :(得分:16)

有许多选项,如其他几个Stack Overflow答案所述(请参阅Caarloscomment)。我会在这里总结一下:

  1. 使用script + printf ,不需要额外的依赖项:

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

    或者使用bash函数faketty来封装它:

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

    或者在鱼壳里:

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

    (功劳归于此answer

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

  2. 使用unbuffer命令(作为expect命令套件的一部分),遗憾的是这需要50mb +安装,但这是最简单的解决方案:< / p>

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

    或者如果你使用鱼壳:

    function faketty
        unbuffer -p $argv
    end
    faketty ls --color=auto | cat 
    

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

  3. 这是一篇关于TTY如何工作以及伪TTY(PTY)是什么的伟大文章,如果你想了解linux shell如何使用文件描述符来传递输入,输出和信号,那么值得一看。 。 http://www.linusakesson.net/programming/tty/index.php