Cli*_*ore 8 bash colors stderr
在自动化任务时,首先手动测试它是明智的。但是,如果进入 stderr 的任何数据都可以立即识别,并且可以与进入 stdout 的数据区分开来,并且将所有输出放在一起,那么事件序列是什么,这将是有帮助的。
如果在程序退出时打印其返回代码,那么最后的接触会很好。
所有这些都有助于自动化。是的,我可以在程序完成时回显返回码,是的,我可以重定向 stdout 和 stderr;我真正喜欢的是一些外壳、脚本或易于使用的重定向器,它们以黑色显示标准输出,以红色显示与标准输出交错的标准错误,并在最后打印退出代码。
有这样的野兽吗?[如果重要的话,我在 Mac OS X 上使用 Bash 3.2]。
更新:对不起,我已经有几个月没有看过这个了。我想出了一个简单的测试脚本:
#!/usr/bin/env python
import sys
print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"
Run Code Online (Sandbox Code Playgroud)
在我的测试中(可能是由于缓冲方式),rse 和 hilite 显示来自 stdout 的所有内容,然后显示来自 stderr 的所有内容。fifo 方法获得了正确的顺序,但似乎对 stderr 行后面的所有内容进行了着色。ind 抱怨我的 stdin 和 stderr 行,然后将 stderr 的输出放在最后。
这些解决方案中的大多数都是可行的,因为只有最后一个输出进入 stderr 并不是不典型的,但是,如果有一些稍微好一点的东西会很好。
我刚刚设计了一个涉及 FIFO 的疯狂方法。
$ mkfifo foo
$ grep --color . foo &
$ your_command 2>foo
Run Code Online (Sandbox Code Playgroud)
如果您希望将 stderr 输出分开,您可以打开两个单独的 shell 并grep --color . foo在一个不带 的情况下运行“ ” &,然后在另一个中运行命令(仍然使用2>foo)。您将在grep其中获得 stderr并在主要获得 stdout 。
这是有效的,因为 stderr 输出通过 FIFO 路由到grep --color,其默认颜色为红色(至少对我来说是这样)。完成后,只需rmFIFO ( rm foo)。
警告:我真的不确定这将如何处理输出顺序,您必须对其进行测试。
小智 7
是的,这是可能的。查看此站点上的“使 STDERR 变为红色”部分,以获取一个工作示例。
基本代码是这样的
# Red STDERR
# rse <command string>
function rse()
{
# We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
# Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}
Run Code Online (Sandbox Code Playgroud)
函数本身给出了简要说明。所做的是移动 STDOUT 和 STDERR,因此sed将 STDERR 放入 1,将其着色,然后将其交换回来。将文件流 3 视为此处的临时变量。
调用非常简单
rse commands
Run Code Online (Sandbox Code Playgroud)
但是,某些调用不会按预期工作;注意事项都在链接页面上提供。
顺便说一句,我认为也可以提供以下形式的解决方案
commands | rse
Run Code Online (Sandbox Code Playgroud)
其中 rse 将为输出着色。
我还发现这个hilite项目似乎可以做到这一点。我没有试过,但它可能是你正在寻找的。
hilite 是一个微型实用程序,它执行您指定的命令,突出显示打印到 stderr 的任何内容。它主要设计用于构建,使警告和错误像陈词滥调一样突出。
其他相关项目:
| 归档时间: |
|
| 查看次数: |
3556 次 |
| 最近记录: |