2015-03-31 24 views
0

作爲較大程序的一部分時,我進行呼叫到grep,並輸出其結果到標準輸出:保留顏色代碼EXEC-ING

// execute grep command 
cmd := exec.Command(GREP_BIN_PATH, argArray...) 
stdout, err := cmd.StdoutPipe() 
if err != nil { 
    log.Fatal(err) 
} 
stderr, err := cmd.StderrPipe() 
if err != nil { 
    log.Fatal(err) 
} 

err = cmd.Start() 
if err != nil { 
    log.Fatal(err) 
} 
go io.Copy(os.Stdout, stdout) 
go io.Copy(os.Stderr, stderr) 
cmd.Wait() 

如果我作出相同的呼叫直接用grep從終端,grep輸出多色文本(例如,在其輸出中以紅色突出顯示任何匹配)。做一點研究,似乎有grep /其他程序用來改變顏色突出顯示的特殊ansi color codes

當我執行命令時,這些顏色會去哪裏?有沒有什麼辦法可以從內部執行來保存ansi顏色代碼,並將輸出從grep複製到標準輸出(類似於後here,但是去)?

(I也知道,我可以手動重新插入顏色代碼,但是這似乎很痛苦,我寧願只是管道grep的原始色彩。)

請讓我知道如果事情在這個問題不清楚/需要澄清。謝謝!

+1

'$ man grep'並搜索顏色。 – Volker 2015-03-31 18:00:06

回答

5

grep和大多數其他使用顏色的工具在他們決定是否使用顏色時會檢測它們是否將輸出發送到終端。

文件和管道等通常不需要顏色代碼,不知道如何處理它們。

儘管你可以強制grep--color=always標誌輸出顏色。

+0

只是爲了快速擴展此響應。仔細觀察grep源代碼,看起來grep檢測是否將輸出發送到終端的方式是檢查TERM環境變量。 (請參閱https://www.gnu.org/software/gettext/manual/html_node/The-TERM-variable.html)。假定使用此環境變量集來解決問題。 (雖然,我還沒有明確檢查。) – 2015-03-31 21:27:57

+0

我會假設它也檢查'isatty'或類似的調用,但可能不會。 – 2015-03-31 21:32:46

+0

感謝您指出這一點,Etan。我檢查了源代碼:它也使用「isatty」。此外,它需要''isatty''返回true(對於stdout)*和*要設置的TERM環境變量(並且不等於「dumb。」)。結果,我不認爲我的解決方案僅僅是將一個額外的TERM env變量傳遞給exec將會工作:isatty條件可能仍然返回false。 – 2015-04-01 21:29:17