看来程序正在重写各种 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。