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使其变成sed的stdin.>&3- 简写1>&3,重定向stdout到新的临时文件描述符3. 3被送回stdout以后.sed ...- 由于上面的重定向,sed's stdin是stderr执行命令的.它的功能是用颜色代码包围每一行.$'...' 一个bash结构,使它能理解反斜杠转义的字符.* - 匹配整条线.\e[31m - ANSI转义序列,导致以下字符为红色&- sed替换字符,扩展为整个匹配的字符串(在本例中为整行).\e[m - 重置颜色的ANSI转义序列.>&2-速记1>&2,这个重定向sed的stdout到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,'
)
Run Code Online (Sandbox Code Playgroud)
我看不出终端仿真器有什么办法可以做到这一点.
终端仿真器和shell/app之间的接口是通过伪tty,终端仿真器在主端,而shell/app在另一端.shell/app有stdout和stderr连接到同一个pty,所以当终端模拟器从pty读取shell/app输出时,它不再能告诉哪个写入stdout以及哪个写入stderr.
您将不得不使用拦截应用程序和slave-pty之间的数据的解决方案之一,并插入转义码来控制终端输出colo(u)r.
| 归档时间: |
|
| 查看次数: |
10156 次 |
| 最近记录: |