STDOUT和STDERR在XTerm / Konsole下使用不同的颜色吗? [英] Can STDOUT and STDERR use different colors under XTerm / Konsole?

查看:245
本文介绍了STDOUT和STDERR在XTerm / Konsole下使用不同的颜色吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以实现?



我们需要 STDERR 流然后 STDOUT )有不同的colo(u)r。例如红色。



我们使用 bash ,终端应为 Konsole



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

  color()(set -o pipefail;$ @2>& 1&&; 3 | sed $' ,\e [31m& \e [m,'& 2)3>& 1 


$ b b

使用它:

  $ color command -program -args 

它会以红色显示命令的 stderr



继续阅读以了解其工作原理的解释。这个命令展示了一些有趣的功能。




  • color()... —创建一个称为颜色的bash函数。

  • set -o pipefail —这是一个shell选项,保留命令的错误返回码,该命令的输出通过管道传递到另一个命令。这在一个子shell中完成,它由括号创建,以便不更改外壳中的pipefail选项。

  • $ @—将函数的参数作为新命令执行。 $ @等效于$ 1$ 2...

  • 2>& 1 —将命令的 stderr 重定向到 stdout ,使其成为 sed 1>< 3 的缩写,将 stdout 重定向到新的临时文件描述符 3 3 稍后路由回 stdout

  • sed ... —由于上面的重定向, sed stdin stderr 。它的功能是用颜色代码包围每一行。

  • $'...'一个bash结构,

  • —匹配整行。

  • \e [31m —导致以下字符为红色的ANSI转义序列

  • & sed 替换扩展到整个匹配字符串(本例中为整行)的字符。

  • \e [m —用于重置颜色的ANSI转义序列。

  • >& 2 1>< / c $ c>的缩写,重定向 sed stdout stderr

  • 3& 1 —将临时文件描述符 3重定向回 stdout



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

  function stdred()(
set -o pipefail;
($ @2>& 1&&; 3 | sed $' ,\e [31m& \e [m,'& 2)3& 1 \
| sed $'s,。*,\e [32m& m,'


Is it even achievable?

We need STDERR (ie. other streams then STDOUT) to have different colo(u)r. For example red.

We use bash, terminal should be Konsole (XTerm, gnome terminal or any usable).

Thanks if you know :-)

解决方案

Here's a solution that combines some of the good ideas already presented.

Create a function in a bash script:

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

Use it like this:

$ color command -program -args

It will show the command's stderr in red.

Keep reading for an explanation of how it works. There are some interesting features demonstrated by this command.

  • color()... — Creates a bash function called color.
  • set -o pipefail — This is a shell option that preserves the error return code of a command whose output is piped into another command. This is done in a subshell, which is created by the parentheses, so as not to change the pipefail option in the outer shell.
  • "$@" — Executes the arguments to the function as a new command. "$@" is equivalent to "$1" "$2" ...
  • 2>&1 — Redirects the stderr of the command to stdout so that it becomes sed's stdin.
  • >&3 — Shorthand for 1>&3, this redirects stdout to a new temporary file descriptor 3. 3 gets routed back into stdout later.
  • sed ... — Because of the redirects above, sed's stdin is the stderr of the executed command. Its function is to surround each line with color codes.
  • $'...' A bash construct that causes it to understand backslash-escaped characters
  • .* — Matches the entire line.
  • \e[31m — The ANSI escape sequence that causes the following characters to be red
  • & — The sed replace character that expands to the entire matched string (the entire line in this case).
  • \e[m — The ANSI escape sequence that resets the color.
  • >&2 — Shorthand for 1>&2, this redirects sed's stdout to stderr.
  • 3>&1 — Redirects the temporary file descriptor 3 back into stdout.

Here's an extension of the same concept that also makes STDOUT green:

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

这篇关于STDOUT和STDERR在XTerm / Konsole下使用不同的颜色吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆