当自动执行任务时,首先进行手动测试是明智的。但是,如果任何进入 stderr 的数据都能立即被识别,并与进入 stdout 的数据区分开来,并且将所有输出放在一起,那么事件的顺序就一目了然了,这将会很有帮助。
最后一个改进是,如果在程序退出时,打印出它的返回代码。
所有这些都有助于实现自动化。是的,我可以在程序完成时回显返回代码,是的,我可以重定向 stdout 和 stderr;我真正想要的是一些 shell、脚本或易于使用的重定向器,它以黑色显示 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"
在我的测试中(可能由于缓冲方式的原因),rse 和 hilite 显示来自 stdout 的所有内容,然后显示来自 stderr 的所有内容。fifo 方法的顺序正确,但似乎将 stderr 行后面的所有内容都着色了。ind 对我的 stdin 和 stderr 行有异议,然后将 stderr 的输出放在最后。
大多数这些解决方案都是可行的,因为只有最后的输出进入 stderr 并不罕见,但是,如果能有更好的解决方案就更好了。
答案1
您还可以查看 stderred:https://github.com/sickill/stderred
答案2
我刚刚设计了一种涉及 FIFO 的疯狂方法。
$ mkfifo foo
$ grep --color . foo &
$ your_command 2>foo
如果您希望将 stderr 输出分开,您可以打开两个单独的 shell,grep --color . foo
在一个不带 的 shell 中运行“ ” &
,然后在另一个(仍带2>foo
)中运行命令。您将在其中一个 shell 中获得 stderr grep
,在主 shell 中获得 stdout。
这是因为 stderr 输出通过 FIFO 路由到grep --color
,其默认颜色为红色(至少对我来说是红色)。完成后,只需rm
FIFO ( rm foo
)。
警告:我真的不确定这将如何处理输出顺序,你必须测试一下。
答案3
是的,这是可能的。请查看在此网站上“将 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
}
函数本身给出了简要说明。它的作用是移动 STDOUT 和 STDERR,因此sed获取 1 中的 STDERR,对其进行着色,然后将其交换回去。在这里将文件流 3 视为临时变量。
调用非常简单
rse commands
但是,某些调用不会按预期工作;所有注意事项均在链接页面上提供。
顺便说一句,我认为也可以提出以下形式的解决方案
commands | rse
其中 rse 将为输出添加颜色。
我也发现了这个希莱特似乎有这个项目可以做到这一点。我还没有尝试过,但它可能就是你正在寻找的。
hilite 是一个小型实用程序,它执行您指定的命令,突出显示打印到 stderr 的任何内容。它主要用于构建,使警告和错误像陈词滥调一样突出。
其他相关项目:
答案4
有annotate-output
一个实用程序(devscripts
Debian 包),如果你想不使用颜色
$ annotate-output /tmp/test.py
14:24:57 I: Started /tmp/test.py
14:24:57 E: this is stderr
14:24:57 O: this is stdout
14:24:57 O: this is stdout again
14:24:57 I: Finished with exitcode 0