Bash

bash:以紅色列印標準錯誤

  • January 27, 2021

有沒有辦法讓 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’sstdinstderr執行命令的。它的功能是用顏色程式碼包圍每一行。
  • $'...'一個 bash 構造,使其能夠理解反斜杠轉義字元
  • .*— 匹配整行。
  • \e[31m— 導致以下字元變為紅色的 ANSI 轉義序列
  • &sed擴展為整個匹配字元串(本例中為整行)的替換字元。
  • \e[m— 重置顏色的 ANSI 轉義序列。
  • >&2— 的簡寫1>&2,這會將sed‘重定向stdoutstderr

引用自:https://serverfault.com/questions/59262