2011-10-19 51 views
3

我有一個Perl腳本,在bash下輸出一些彩色文本。例如,這將輸出一個紅色的字符串:bash彩色文本和管道

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

當我將它傳輸到另一個程序時,例如, VIM ... | vim -,我可以看到的顏色格式化雜亂字符:

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

,我希望他們被跳過。例如grep就是這種情況,你會在bash中看到顏色,但是當輸出重定向時它們會被跳過。

如何做到這一點?

回答

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 } 

應該這樣做。

+0

你可以測試沒有IO ::交互模塊:if(-t STDOUT){$ ENV {ANSI_COLORS_ENABLED} = 1} –

+0

@RodrigoSiqueira我不確定評論的目的是什麼。我的答案特別指出*可以使用-t文件測試來確定輸出是否爲tty *。 IO :: Interactive模塊提供了更多內容。查看我的答案鏈接的FAQ條目。 –

1

對於grep,grep檢測到它的輸出不會到達終端並且不會創建轉義序列。

另一種方法將是使用sed來剔除那些轉義序列:

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

(注意:有很多更ANSI escape sequences比這;但這應該覆蓋的顏色。)

+0

它甚至可以配置,所以如果您需要在管道流中使用顏色代碼,您可以擁有它。 –

+0

任何想法如何在Perl中檢測它? –

+0

是的, - color = always。顏色可以配置環境變量... – retracile

2

你必須找出stdout是什麼樣的句柄。我不記得細節,但可以找出句柄是否指向文件,僞tty(終端窗口)或​​管道。

+1

'-t FILEHANDLE'會告訴你文件句柄是否打開到tty。 – mob

+0

@mob:謝謝,幫助! –