每当我使用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),但是根据我在文档中可以阅读的内容,我不确定它对我的问题有帮助
答案 0 :(得分:16)
有许多选项,如其他几个Stack Overflow答案所述(请参阅Caarlos的comment)。我会在这里总结一下:
使用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)
使用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
这是一篇关于TTY如何工作以及伪TTY(PTY)是什么的伟大文章,如果你想了解linux shell如何使用文件描述符来传递输入,输出和信号,那么值得一看。 。 http://www.linusakesson.net/programming/tty/index.php