bash彩色文字和管道

时间:2011-10-19 14:22:55

标签: perl bash

我有一个Perl脚本,可以在bash下输出一些彩色文本。例如,这将输出一个红色字符串:

perl -e 'print "\e[1;31m RED \e[m"

当我将它传送到另一个程序时,例如vim ... | vim -,我可以看到颜色形成杂乱的字符:

^[[1;31m RED ^[[m

我希望他们被跳过。例如,对于grep,您会看到bash中的颜色,但是在重定向输出时会跳过它们。

怎么做?

3 个答案:

答案 0 :(得分:6)

如果使用Term::ANSIColor生成转义序列,则可以设置ANSI_COLORS_DISABLED环境变量以禁用转义序列生成。

您可以使用-t文件测试来确定输出是否为tty(或detect if your script is being run interactively)。

然后,在输出任何序列之前,在Perl脚本中设置环境变量。

类似的东西:

use IO::Interactive;

BEGIN { is_interactive() or $ENV{ANSI_COLORS_DISABLED} = 1 }

应该这样做。

答案 1 :(得分:2)

你必须找出stdout是什么样的句柄。我不记得细节,但可以找出句柄是指向文件,伪tty(终端窗口)还是管道。

答案 2 :(得分:1)

对于grep,grep检测到它的输出没有到达终端,也没有创建转义序列。

另一种方法是使用sed去掉那些转义序列:

sed 's/\o033\[[0-9;]*m//'

(注意:还有很多ANSI escape sequences比这更多;但这应该包括颜色。)