我怎样才能写入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转义码