Is it even achievable?
我希望命令的stderr输出的 colored颜色 与stdout不同(例如,红色).
我需要这样的修改才能在Linux上的Konsole、XTerm或GNOME终端模拟器中使用Bash shell.
Is it even achievable?
我希望命令的stderr输出的 colored颜色 与stdout不同(例如,红色).
我需要这样的修改才能在Linux上的Konsole、XTerm或GNOME终端模拟器中使用Bash shell.
下面是一个结合了一些好 idea 的解决方案.
在bash脚本中创建函数:
color() ( set -o pipefail; "$@" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1
这样使用:
$ color command -program -args
它将以红色显示命令的stderr
.
继续阅读,了解它是如何工作的.这个命令演示了一些有趣的特性.
color()...
-创建名为color的bash函数.set -o pipefail
-这是一个shell选项,用于保留命令的错误返回码,该命令的输出通过管道传输到另一个命令.这是在由括号创建的子shell中完成的,这样就不会更改shell 中的pipefail选项."$@"
-将函数的参数作为新命令执行."$@"
等于"$1" "$2" ...
2>&1
-将命令的stderr
重定向到stdout
,使其成为sed
的stdin
.>&3
——1>&3
的简写,它将stdout
重定向到一个新的临时文件描述符3
.3
稍后被路由回stdout
.sed ...
-由于上面的重定向,sed
的stdin
是已执行命令的stderr
.它的功能是用 colored颜色 代码围绕每一行.$'...'
使其理解反斜杠转义字符的bash构造.*
-匹配整条线.\e[31m
-导致以下字符变为红色的ANSI转义序列&
-扩展到整个匹配字符串(本例中为整行)的sed
替换字符.\e[m
-重置 colored颜色 的ANSI转义序列.>&2
——1>&2
的简写,将sed
的stdout
重定向到stderr
.3>&1
-将临时文件描述符3
重定向回stdout
.这是对同样概念的一个扩展,它也让STDOUT变得绿色:
function stdred() (
set -o pipefail;
(
"$@" 2>&1>&3 |
sed $'s,.*,\e[31m&\e[m,' >&2
) 3>&1 |
sed $'s,.*,\e[32m&\e[m,'
)