有没有办法让 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
'sstdin
是stderr
执行的命令的。它的作用是用颜色代码包围每一行。$'...'
一个 bash 构造,使其能够理解反斜杠转义字符.*
— 匹配整行。\e[31m
— 导致以下字符变为红色的 ANSI 转义序列&
—sed
替换字符扩展为整个匹配的字符串(在本例中为整行)。\e[m
— 重置颜色的 ANSI 转义序列。>&2
— 的简写1>&2
,这会将sed
重定向stdout
到stderr
。
答案2
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
答案3
您还可以查看 stderred:https://github.com/sickill/stderred