Bash
我可以將我的 shell 配置為以不同顏色列印 STDERR 和 STDOUT 嗎?
我想設置我的終端,所以
stderr
列印的顏色不同於stdout
; 也許是紅色的。這樣更容易區分兩者。有沒有辦法配置這個
.bashrc
?如果沒有,這甚至可能嗎?注意:這個問題與另一個問題合併
stderr
,stdout
使用者輸入的迴聲以3 種不同的顏色輸出。答案可能正在解決任何一個問題。
這是Show only stderr on screen 但將 stdout 和 stderr 都寫入 file的更難版本。
終端中執行的應用程序使用單一通道與其通信;應用程序有兩個輸出埠,stdout 和 stderr,但它們都連接到同一個通道。
您可以將其中一個連接到不同的通道,為該通道添加顏色,然後合併兩個通道,但這會導致兩個問題:
- 合併的輸出可能與沒有重定向的順序完全相同。這是因為在其中一個通道上添加的處理需要(一點)時間,因此彩色通道可能會延遲。如果進行任何緩衝,疾病將變得更糟。
- 終端使用變色轉義序列來確定顯示顏色,例如
␛[31m
表示“切換到紅色前景”。這意味著,如果某些發往 stdout 的輸出正好在顯示 stderr 的某些輸出時到達,則輸出將顏色錯誤。(更糟糕的是,如果在轉義序列中間有一個通道切換,你會看到垃圾。)原則上,可以編寫一個同步監聽兩個 pty 的程序(即在處理另一個通道上的輸出時不接受一個通道上的輸入),並立即使用適當的顏色更改指令輸出到終端。您將失去執行與終端互動的程序的能力。我不知道這種方法的任何實現。
另一種可能的方法是使程序輸出正確的顏色變化序列,方法是
write
在載入了LD_PRELOAD
. 有關現有實現,請參閱ickill 的答案,或有關利用strace
.在實踐中,如果適用,我建議將 stderr 重定向到 stdout 並將管道導入基於模式的著色器,例如colortail或multitail,或特殊用途的著色器,例如colorgcc或colormake。
¹偽終端。由於緩衝,管道無法工作:源可以寫入緩衝區,這會破壞與著色器的同步性。
退房
stderred
。它用於LD_PRELOAD
掛鉤到libc
的write()
呼叫,為所有stderr
到終端的輸出著色。(預設為紅色。)