Is it even achievable?

我希望命令的stderr输出的 colored颜色 与stdout不同(例如,红色).

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

推荐答案

下面是一个结合了一些好 idea 的解决方案.

在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中完成的,这样就不会更改shell 中的pipefail选项.
  • "$@"-将函数的参数作为新命令执行."$@"等于"$1" "$2" ...
  • 2>&1-将命令的stderr重定向到stdout,使其成为sedstdin.
  • >&3——1>&3的简写,它将stdout重定向到一个新的临时文件描述符3.3稍后被路由回stdout.
  • sed ...-由于上面的重定向,sedstdin是已执行命令的stderr.它的功能是用 colored颜色 代码围绕每一行.
  • $'...'使其理解反斜杠转义字符的bash构造
  • .*-匹配整条线.
  • \e[31m-导致以下字符变为红色的ANSI转义序列
  • &-扩展到整个匹配字符串(本例中为整行)的sed替换字符.
  • \e[m-重置 colored颜色 的ANSI转义序列.
  • >&2——1>&2的简写,将sedstdout重定向到stderr.
  • 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相关问答推荐

C++17/Linux:信号未解锁单独线程中被阻止的网络套接字调用

在PowerShell for Linux上,打印出的maven命令还有其他字符

删除一行和它之前的一行

有必要注意非错误提示吗?好像没有找到包裹‘***’?

命令应在终端关闭后继续运行

获取S3路径的linux命令

Azure Nvidia 中的 apt-update 给出公钥错误

如何使用换行符或制表符或空格 grep 多行字符串

使用 awk 将 csv 拆分为带有标题的多个文件

Linux time 命令输出中 real、user 和 sys 的含义

如何在 Linux 中设置目录大小限制?

Linux C程序:如何找到函数所属的库

PuTTY:更改默认 SSH 登录目录

我想为 Linux 内核做贡献

与交换空间相关的链接器性能?

为 django 项目安装 memcached

如何在 Linux 上传递带感叹号的参数?

给定一个 linux 用户名和密码,我如何测试它是否是有效帐户?

如何在 Linux 中使用单行命令获取 Java 版本

如何限制堆大小?