Bash
bash:以紅色列印標準錯誤
有沒有辦法讓 bash以紅色顯示標準錯誤消息?
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
方法一:直接使用程序替換:
command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
方法 2:在 bash 或 zsh 中創建一個函式:
color()(set -o pipefail;"$@" 2> >(sed $'s,.*,\e[31m&\e[m,'>&2))
像這樣使用它:
$ color command
兩種方法都會
stderr
以紅色顯示命令。繼續閱讀以了解其工作原理。這些命令展示了一些有趣的特性。前 3 個要點僅適用於方法 2。其餘的適用於兩種方法。
color()...
— 創建一個名為 color 的 bash 函式。set -o pipefail
— 這是一個 shell 選項,它保留一個命令的錯誤返回碼,該命令的輸出通過管道傳輸到另一個命令中。這是在由括號創建的子shell中完成的,以免更改外殼中的 pipefail 選項。"$@"
— 將函式的參數作為新命令執行。"$@"
相當於"$1" "$2" ...
2> >(...)
— 該>(...)
語法稱為程序替換。前面是2>
,它將stderr
主命令的 連接到括號內stdin
的程序的 。sed
sed ...
— 由於上面的重定向,sed
’sstdin
是stderr
執行命令的。它的功能是用顏色程式碼包圍每一行。$'...'
一個 bash 構造,使其能夠理解反斜杠轉義字元.*
— 匹配整行。\e[31m
— 導致以下字元變為紅色的 ANSI 轉義序列&
—sed
擴展為整個匹配字元串(本例中為整行)的替換字元。\e[m
— 重置顏色的 ANSI 轉義序列。>&2
— 的簡寫1>&2
,這會將sed
‘重定向stdout
到stderr
。