我怎样才能写入stderr以便stderred将它变成红色?
作为背景,我之前问过这个问题 。
当我在终端上显示时,我正在使用stderred将stderr文本变成红色。 这在大多数情况下都很好用,更具体地说,对于看似二进制可执行文件而不是bash脚本。
我意识到当从终端调用的command
直接引用stderr时, stderred
似乎不起作用。
例如,如果我使用重定向,使用stderred
我仍然没有红色,如下所示:
echo "pomme" 1>&2
重定向与stderred
钩子的其他情况有何不同?
如果我在/bin/bash
上下文中重定向1>&2
,如何在bash脚本(Ubuntu 15.10)中进行重定向?
如果你看一下stderred
的README,你会注意到它修改了write()
函数 (以及相关的流函数):
lib()上的stderred钩子和来自libc的一系列流函数(fwrite,fprintf,error …),以便为去往终端的所有stderr输出着色,从而使其与stdout区分开来。 基本上, 它包含带有描述符“2”的文本,并带有适当的ANSI转义码,使文本变为红色。
强调我的。
当你将stdout重定向到stderr时,他们指向同样的事情,是的。 但是,写入stdout的函数调用仍将其称为stdout,无论您执行何种重定向。 他们仍然访问文件描述符1,而不是2。
如果你想写入stderr,并让它着色,正常的shell重定向是不够的。 你需要使用直接写入stderr的东西。 类似的Unix和Linuxpost中的awk函数可以适用于多个参数:
error () ( IFS=' ' awk -v msg="$*" 'BEGIN { print msg > "/dev/stderr" }' )
我使用/dev/stderr
因为它更容易阅读并在GNU awk文档中提到。 另请注意,我使用( )
而不是{ }
进行命令分组。 这会导致命令在子shell中运行,因此我可以安全地修改IFS,而不会影响调用shell或脚本。
参考文献:
- 终端代码(ANSI / VT100)介绍Bash Hackers的Wiki
- 维基百科上的ANSI转义码