如何判断输出是否发送到 stderr
How to tell if output was sent to stderr
我必须将命令包装在 bash 脚本中。
如果命令以退出代码退出!= 0 and/or 写入 stderr 发生必须处理的故障。
第一个条件很简单。
但是如何判断是否有输出到 stderr?我不想截取或捕获输出(除非没有其他方法),我只需要知道 if 是否有。
建议:"tee" stderr 到临时文件,并在命令结束时检查此文件是否具有非零大小。
您可以通过注意进程的 文件描述符在 /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、bash 的 stderr 是一个
有限公司。按照 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
我必须将命令包装在 bash 脚本中。
如果命令以退出代码退出!= 0 and/or 写入 stderr 发生必须处理的故障。
第一个条件很简单。 但是如何判断是否有输出到 stderr?我不想截取或捕获输出(除非没有其他方法),我只需要知道 if 是否有。
建议:"tee" stderr 到临时文件,并在命令结束时检查此文件是否具有非零大小。
您可以通过注意进程的 文件描述符在 /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、bash 的 stderr 是一个
有限公司。按照 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