我怎样才能写入 stderr 以便 stderred 将其颜色变为红色?

我怎样才能写入 stderr 以便 stderred 将其颜色变为红色?

作为背景,我之前问过这个问题

我在用标准错误转动标准错误在终端上显示时文本显示为红色。这在大多数情况下都很有效,尤其是对于二进制可执行文件(而不是 bash 脚本)而言。

我意识到这stderred似乎不起作用标准错误是直接从command终端调用的。

例如,stderred如果我使用重定向,则仍然没有红色,如下所示:

echo "pomme" 1>&2

怎么重定向与其他情况相比,stderred钩子有什么不同吗?

我怎样才能得到红色标准错误如果我1>&2在上下文中重定向,会有什么输出/bin/bash,就像我在 bash 脚本(Ubuntu 15.10)中所做的那样?

答案1

如果你看一下stderred的 README,你会注意到它修改了write()功能(以及相关的流函数):

stderred 钩在 write() 和 libc 中的一系列流函数(fwrite、fprintf、error...)上,以便为进入终端的所有 stderr 输出着色,从而使其与 stdout 区分开来。基本上它使用适当的 ANSI 转义码包装进入描述符为“2”的文件的文本使文本变为红色。

强调我的。

当您将 stdout 重定向到 stderr 时,它们指向的是同一个东西,确实如此。但是,无论您执行什么重定向,写入 stdout 的函数调用仍将其称为 stdout。它们仍然访问文件描述符 1,而不是 2。

如果您想要写入 stderr 并将其设置为彩色,则普通的 shell 重定向是不够的。您需要使用直接写入 stderr 的程序。awk 函数类似的 Unix 和 Linux 帖子可以适用于多个参数:

error () (
  IFS=' '
  awk -v msg="$*" 'BEGIN { print msg > "/dev/stderr" }'
)

我使用这个/dev/stderr,因为它更容易阅读,并在GNU awk 文档。另请注意,我使用了( )而不是{ }来进行命令分组。这会导致命令在子 shell 中运行,因此我可以安全地修改 IFS,而不会影响调用 shell 或脚本。

参考:

相关内容