linux - 是否可以在 XTerm 或 Konsole 中使 stdout 和 stderr 输

它甚至可以实现吗?

我希望命令的标准错误输出以不同于标准输出的颜色呈现(例如,红色)。

我需要这样的修改才能在 Linux 上的 Konsole、XTerm 或 GNOME 终端终端仿真器中使用 Bash shell。

最佳答案

这是一个结合了一些已经提出的好想法的解决方案。

在 bash 脚本中创建函数:

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

像这样使用它:

$ color command -program -args

它将以红色显示命令的stderr

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

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

以下是同样概念的扩展,它也使 STDOUT 变为绿色:

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

关于linux - 是否可以在 XTerm 或 Konsole 中使 stdout 和 stderr 输出具有不同的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763891/

相关文章:

linux - Unix管道到ls

c - 使用 gdb 将地址转换为行

linux - 如何在 unix 中解压 tar.bz 文件?

c - 无论如何要从命令行获取c程序的返回值?

linux - 如何在 Bash 字符串中添加新行?

c - 如何在 Linux 中创建高分辨率计时器来测量程序性能?

linux - 内联 if shell 脚本

linux - 检查 VT-x 是否已激活而无需在 Linux 中重新启动?

xml - CHMOD 755 与 750 权限集之间的差异

Linux 上的 C++ 开发 - 我从哪里开始?