我怎样才能将红色的标准错误打印到控制台中,而不是使用与标准输出相同的颜色?
是否可以使用Gnome 终端?
答案1
Stderred 挂接 libc 中的 write() 和一系列流函数(fwrite、fprintf、error...),以便为进入终端的所有 stderr 输出着色,从而将其与 stdout 区分开来。基本上,它会使用适当的 ANSI 转义码将进入描述符为“2”的文件的文本包装起来,使文本变为红色。
它作为共享库实现,并且由于动态链接器的预加载/插入功能,不需要重新编译现有的二进制文件。
它支持 Linux(带有 LD_PRELOAD)、FreeBSD(也带有 LD_PRELOAD)和 OSX(带有 DYLD_INSERT_LIBRARIES)。
编译起来很简单,但你需要按照以下说明从源代码构建它:其 Github 网站:
sudo apt-get install build-essential git cmake
然后
git clone git://github.com/sickill/stderred.git
cd stderred
然后
make
其中最重要的部分是将适当的行添加到您的.bashrc
;您必须链接到libstderred.so
构建目录中的文件;您必须使用构建目录所在的绝对路径 (/home/mike/src/stderred/build)。我将以下内容添加到我的.bashrc
:
export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"
显然,当您不想再使用它时,请从中删除上述行.bashrc
并重新启动终端。
在不存在的文件上测试的结果(使用时显然不会起作用,因为在设置不同的环境时不会读取sudo
用户的文件):.bashrc
(顺便说一下没有将我的 duke@nukem 提示变成红色,因为那是红色的已经)
答案2
一般来说是的,因为 Gnome Terminal 是一个 ANSI 终端并且支持标准 ANSI 转义码。
以下是一个例子。在终端中输入:
echo -e "\e[01;31mREDRUM\e[0m"
该-e
选项允许解释反斜杠代码,因此\e
变成“Esc”(十六进制代码 0x1B)。或者,要直接输入 escape,请按ctrl-V Esc:
echo "^[[01;31mREDRUM^[[0m"
Escape 和[
两者共同构成终端可识别的代码。在该序列之后,您需要插入一个以冒号 ( ;
) 分隔的属性列表,并以 结尾m
。请参阅这里对于所有代码。示例包括属性0
(重置所有属性,您可能注意到上面是终止我的示例的序列)和一堆样式(下划线、明亮、粗体等)以及一些颜色属性。
上面的答案告诉您在编写自己的程序时如何使用颜色。
但是,如果我正确理解了您的问题,您希望对正在运行的任何程序的 stderr 和 stdout 进行视觉分离。如果不通过过滤器解析它们的输出,这并不容易。以下是一个例子(发现这里) 怎么做:
定义一个函数(你可以将其放在你的.bashrc文件中):
color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
像这样启动程序:
color program
程序的标准错误信息将会变成红色。