如何判断输出是否已发送到stderr

时间:2015-07-16 06:45:39

标签: bash stderr

我必须在bash脚本中包装一个命令。

如果命令以退出代码退出!= 0和/或写入stderr,则发生故障,必须处理。

第一个条件很简单。 但是如何判断是否有输出到stderr?我不想拦截或捕获输出(除非没有其他方法),我只需要知道如果有任何。

2 个答案:

答案 0 :(得分:0)

建议:将“tee”stderr发送到临时文件,并在命令结束时检查此文件的大小是否为非零。

答案 1 :(得分:0)

您可以通过注意进程的文件描述符在/ proc / 中公开来执行此操作。例如,如果你这样做

$ ls -l /proc/self/fd/2
lrwx------ 1 meuh meuh 64 Jul 16 10:06 /proc/self/fd/2 -> /dev/pts/2

在xterm或类似的中你可以看到 self 的bder,bash,是一个 PTY。按照ls中的符号链接获取上次修改pty的实时时间:

$ ls -lL /proc/self/fd/2
crw--w---- 1 meuh tty 136, 2 Jul 16 10:05 /proc/self/fd/2

更好的使用命令是 stat ,可以提供更好的时间分辨率。

$ stat -L -c %y /proc/self/fd/2
2015-07-16 10:03:54.553125813

所以只需在命令之前保存时间戳,然后在之后进行比较 命令,看它是否不同。

before=$(stat -L -c %y /proc/self/fd/2)
if mycommand &&
 after=$(stat -L -c %y /proc/self/fd/2) &&
 [ "$after" = "$before" ]
then echo 'command ok'
else echo 'command fail'
fi