如何用红色打印标准错误

Asl*_*986 14 gnome-terminal

如何将标准错误以红色打印到控制台而不是使用与标准输出相同的颜色?

是否可以使用Gnome 终端

小智 8

我使用stderred并发现它是一个很好的解决方案。正如其自述文件所述

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

由于动态链接器的预加载/插入功能,它是作为共享库实现的,不需要重新编译现有的二进制文件。

它在 Linux(带有 LD_PRELOAD)、FreeBSD(还有 LD_PRELOAD)和 OSX(带有 DYLD_INSERT_LIBRARIES)上受支持。

编译很简单,但您确实需要按照其 Github 站点的说明从源代码构建它:

sudo apt-get install build-essential git cmake 
Run Code Online (Sandbox Code Playgroud)

然后

git clone git://github.com/sickill/stderred.git
cd stderred
Run Code Online (Sandbox Code Playgroud)

然后

make
Run Code Online (Sandbox Code Playgroud)

其中最重要的部分是将适当的行添加到您的.bashrc; 您必须链接到libstderred.so构建目录中的文件;您必须使用构建目录所在的绝对路径 (/home/mike/src/stderred/build)。我将以下内容添加到我的.bashrc

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"
Run Code Online (Sandbox Code Playgroud)

显然,当您不想再使用它时,请从您的行中删除以上行.bashrc并重新启动终端。

结果,在不存在的文件上测试(使用时显然不起作用sudo,因为.bashrc设置不同的环境时不会读取用户的):

(顺便说一下,它不会将我的 duke@nukem 提示变成红色,因为它已经是红色的

在此处输入图片说明


Jan*_*ary 6

一般来说是的,因为 Gnome 终端是一个 ANSI 终端并且支持标准的 ANSI 转义码。

这是一个例子。在你的终端中输入:

echo -e "\e[01;31mREDRUM\e[0m"
Run Code Online (Sandbox Code Playgroud)

-e选项允许解释反斜杠代码,使其\e成为“Esc”(十六进制代码 0x1B)。或者,要直接输入转义,请按ctrl-V Esc

echo  "^[[01;31mREDRUM^[[0m"
Run Code Online (Sandbox Code Playgroud)

Escape 和[两者一起形成终端识别的代码。在该序列之后,您需要插入以冒号 ( ;) 分隔的属性列表,以m. 请参阅此处了解所有代码。示例包括属性0(重置所有属性,正如您在上面可能注意到的那样,这是终止我的示例的序列)和一堆样式(下划线、明亮、粗体等)以及一些颜色属性。

上面的答案告诉您在编写自己的程序时如何使用颜色。

但是,如果我正确理解您的问题,您希望对正在运行的任何程序的 stderr 和 stdout 进行视觉分离。如果不通过过滤器解析它们的输出,这并不简单。这是一个示例(找到here)如何做到这一点:

  1. 定义一个函数(你可以把它放在你的 .bashrc 文件中):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 像这样启动程序:

    color program
    
    Run Code Online (Sandbox Code Playgroud)

程序中的 stderr 将变为红色。