立即告知哪些输出已发送到 stderr

立即告知哪些输出已发送到 stderr

当自动执行任务时,首先进行手动测试是明智的。但是,如果任何进入 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,其默认颜色为红色(至少对我来说是红色)。完成后,只需rmFIFO ( 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一个实用程序(devscriptsDebian 包),如果你想不使用颜色

$ 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

相关内容