STDOUT和STDERR可以在XTerm/Konsole下使用不同的颜色吗?

Din*_*lla 33 linux terminal console colors stream

它甚至可以实现吗?

我们需要STDERR(即其他流然后STDOUT)具有不同的colo(u)r.例如红色.

我们使用bash,终端应该是Konsole(XTerm,gnome终端或任何可用的).

谢谢,如果你知道:-)

kil*_*sh9 43

这是一个结合了已经提出的一些好主意的解决方案.

在bash脚本中创建一个函数:

color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

$ color command -program -args
Run Code Online (Sandbox Code Playgroud)

它将stderr以红色显示命令.

继续阅读以了解其工作原理.此命令演示了一些有趣的功能.

  • color()... - 创建一个名为color的bash函数.
  • set -o pipefail - 这是一个shell选项,用于保存输出通过管道传输到另一个命令的命令的错误返回码.这是在子shell中完成的,子shell由括号创建,以便不更改外壳中的pipefail选项.
  • "$@" - 作为新命令执行函数的参数. "$@"相当于"$1" "$2" ...
  • 2>&1-重定向的stderr命令,以stdout使其变成sedstdin.
  • >&3- 简写1>&3,重定向stdout到新的临时文件描述符3. 3被送回stdout以后.
  • sed ...- 由于上面的重定向,sed's stdinstderr执行命令的.它的功能是用颜色代码包围每一行.
  • $'...' 一个bash结构,使它能理解反斜杠转义的字符
  • .* - 匹配整条线.
  • \e[31m - ANSI转义序列,导致以下字符为红色
  • &- sed替换字符,扩展为整个匹配的字符串(在本例中为整行).
  • \e[m - 重置颜色的ANSI转义序列.
  • >&2-速记1>&2,这个重定向sedstdoutstderr.
  • 3>&1- 将临时文件描述符重定向3stdout.

这是同一概念的扩展,也使STDOUT变为绿色:

function stdred() (
    set -o pipefail;
    ("$@" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2) 3>&1 \
                  | sed $'s,.*,\e[32m&\e[m,'
)
Run Code Online (Sandbox Code Playgroud)

  • 实际上你应该把"$ @"而不是$*,否则你会遇到空格问题. (4认同)
  • 太糟糕的stdout和stderr的行不会以原始顺序返回 - 程序输出一行到stdout,然后是stderr,然后是stdout,然后stderr我得到stdout行,然后是两行stderr行. (3认同)
  • `color`函数的另一个缺点是退​​出代码将丢失,除非你在`set -o pipefail`之前设置(参见http://bclary.com/blog/2006/07/20/pipefail-testing-pipeline-出口码/) (2认同)

sic*_*ill 17

您还可以查看stderred:https://github.com/sickill/stderred


cam*_*amh 5

我看不出终端仿真器有什么办法可以做到这一点.

终端仿真器和shell/app之间的接口是通过伪tty,终端仿真器在主端,而shell/app在另一端.shell/app有stdout和stderr连接到同一个pty,所以当终端模拟器从pty读取shell/app输出时,它不再能告诉哪个写入stdout以及哪个写入stderr.

您将不得不使用拦截应用程序和slave-pty之间的数据的解决方案之一,并插入转义码来控制终端输出colo(u)r.