Bash

我可以將我的 shell 配置為以不同顏色列印 STDERR 和 STDOUT 嗎?

  • October 1, 2021

我想設置我的終端,所以stderr列印的顏色不同於stdout; 也許是紅色的。這樣更容易區分兩者。

有沒有辦法配置這個.bashrc?如果沒有,這甚至可能嗎?


注意:這個問題與另一個問題合併stderrstdout 使用者輸入的迴聲3 種不同的顏色輸出。答案可能正在解決任何一個問題。

這是Show only stderr on screen 但將 stdout 和 stderr 都寫入 file的更難版本。

終端中執行的應用程序使用單一通道與其通信;應用程序有兩個輸出埠,stdout 和 stderr,但它們都連接到同一個通道。

您可以將其中一個連接到不同的通道,為該通道添加顏色,然後合併兩個通道,但這會導致兩個問題:

  • 合併的輸出可能與沒有重定向的順序完全相同。這是因為在其中一個通道上添加的處理需要(一點)時間,因此彩色通道可能會延遲。如果進行任何緩衝,疾病將變得更糟。
  • 終端使用變色轉義序列來確定顯示顏色,例如␛[31m表示“切換到紅色前景”。這意味著,如果某些發往 stdout 的輸出正好在顯示 stderr 的某些輸出時到達,則輸出將顏色錯誤。(更糟糕的是,如果在轉義序列中間有一個通道切換,你會看到垃圾。)

原則上,可以編寫一個同步監聽兩個 pty 的程序(即在處理另一個通道上的輸出時不接受一個通道上的輸入),並立即使用適當的顏色更改指令輸出到終端。您將失去執行與終端互動的程序的能力。我不知道這種方法的任何實現。

另一種可能的方法是使程序輸出正確的顏色變化序列,方法是write在載入了LD_PRELOAD. 有關現有實現,請參閱ickill 的答案或有關利用strace.

在實踐中,如果適用,我建議將 stderr 重定向到 stdout 並將管道導入基於模式的著色器,例如colortailmultitail,或特殊用途的著色器,例如colorgcccolormake

¹偽終端。由於緩衝,管道無法工作:源可以寫入緩衝區,這會破壞與著色器的同步性。

退房stderred。它用於LD_PRELOAD掛鉤到libcwrite()呼叫,為所有stderr到終端的輸出著色。(預設為紅色。)

引用自:https://unix.stackexchange.com/questions/12439