Bash 支持颜色,即\033[31m
切换到红色并且\033[0m
切换回无色。
我想制作一个小型的 bash 包装器,它可以可靠地将 stderr 输出为红色,即它应该将\033[31m
之前和\033[0m
在来自 stderr 的所有内容之后。
我不确定这是否可能,因为当两个并行进程(甚至单个进程)同时写入 stdout 和 stderr 时,必须有一种方法可以通过逐个字符来区分两者。
对文本进行着色非常简单:读取每一行并在开头和结尾处使用适当的转义序列进行回显。但上色标准误变得很棘手,因为标准错误不会传递到管道。
这是一种通过交换标准错误和标准输出,然后过滤标准输出的方法。
这是我们的测试命令:
#!/bin/bash
echo hi
echo 'Error!' 1>&2
And the wrapper
script:
#!/bin/bash
(# swap stderr and stdout
exec 3>&1 # copy stdout to fd 3
exec 1>&2 # copy stderr to fd 1
exec 2>&3- # move saved stdout on fd 3 over to 2
"${@}") | while read line; do
echo -e "\033[31m${line}\033[0m"
done
Then:
$ ./wrapper ./test-command
hi
Error! # <- shows up red
不幸的是,包装器命令的所有输出都来自stderr
, not stdout
,因此您无法将输出通过管道传输到任何其他脚本中。你也许可以通过以下方式解决这个问题创建临时 fifo…但希望这个小包装脚本足以满足您的需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)