写入标准错误

pfn*_*sel 6 bash stderr

我正在使用stderred将所有流式传输到 stderr 的输出着色为红色。它工作正常。但是,当我编写自己的 bash 脚本并使用 抛出错误时echo 'error' 1>&2,它不会将输出着色为红色。我认为这是因为该命令只是将输出重定向到 stderr 文件描述符指向的任何地方,但没有正确地将消息标记为属于 stderr。是这样吗?如何在 bash 中正确写入 stderr?

Ste*_*n D 7

看来程序正在重写各种 write() 函数来检测您是否正在打印到文件描述符 2,然后添加相关的转义码以使终端的输出为红色。

不幸的是,在 shell 中,当你做类似的事情时

echo "foo" 1>&2 
Run Code Online (Sandbox Code Playgroud)

该函数仍将在文件描述符 1 上调用 write(或其他类似的系统调用)。输出出现在 fd 2 上,因为文件描述符 1 已被 shell 复制到文件描述符 2。

不幸的是,我不知道如何在 shell 中将 /directly/ 写入 fd 2,但您可以使用 awk。像这样的函数会将参数直接写入文件描述符 2。

error() {
  awk " BEGIN { print \"$@\" > \"/dev/fd/2\" }"
}
Run Code Online (Sandbox Code Playgroud)

我相信这是 GNU awk 的一个特性,它不是 POSIX 的一部分,但它也适用于 OS X 上提供的 awk。