它甚至可以实现吗?
我希望命令的标准错误输出以不同于标准输出的颜色呈现(例如,红色)。
我需要这样的修改才能在 Linux 上的 Konsole、XTerm 或 GNOME 终端终端仿真器中使用 Bash shell。
最佳答案
这是一个结合了一些已经提出的好想法的解决方案。
在 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中完成的,以免更改外壳中的 pipefail 选项。"$@"
— 将函数的参数作为新命令执行。 "$@"
等价于 "$1""$2"...
2>&1
— 将命令的 stderr
重定向到 stdout
使其成为 sed
的标准输入
.>&3
— 1>&3
的简写,这会将 stdout
重定向到新的临时文件描述符 3
. 3
稍后被路由回 stdout
。sed ...
— 由于上面的重定向,sed
的 stdin
是 stderr
的执行的命令。它的功能是用颜色代码包围每一行。$'...'
一个 bash 结构,使其能够理解反斜杠转义字符.*
— 匹配整行。\e[31m
— ANSI 转义序列导致以下字符变为红色&
— sed
替换字符,扩展为整个匹配字符串(本例中为整行)。\e[m
— 重置颜色的 ANSI 转义序列。>&2
— 1>&2
的简写,这会将 sed
的 stdout
重定向到 标准错误
.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,'
)
关于linux - 是否可以在 XTerm 或 Konsole 中使 stdout 和 stderr 输出具有不同的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763891/