我有一个Perl脚本,可以在bash下输出一些彩色文本。例如,这将输出一个红色字符串:
perl -e 'print "\e[1;31m RED \e[m"
当我将它传送到另一个程序时,例如vim ... | vim -
,我可以看到颜色形成杂乱的字符:
^[[1;31m RED ^[[m
我希望他们被跳过。例如,对于grep
,您会看到bash中的颜色,但是在重定向输出时会跳过它们。
怎么做?
答案 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比这更多;但这应该包括颜色。)