bash:以红色打印 stderr

bash:以红色打印 stderr

有没有办法让 bash 显示标准错误红色的消息?

答案1

方法一:直接使用进程替换:

command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)

方法 2:在 bash 或 zsh 中创建一个函数:

color()(set -o pipefail;"$@" 2> >(sed $'s,.*,\e[31m&\e[m,'>&2))
export -f color

使用方式如下:

$ 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

答案2

command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)

答案3

您还可以查看 stderred:https://github.com/sickill/stderred

答案4

相关内容