Piping command output to tee but also save exit code of command
我有一个shell脚本,其中包含一个命令(mvn clean install),用于将输出重定向到日志文件。
1 2 3 4 | #!/bin/bash ... mvn clean install $@ | tee $logfile echo $? # Does not show the return code of mvn clean install |
现在,如果
我尝试让命令将错误输出写入一个单独的文件,然后检查,但是MVN的错误输出总是空的(似乎它只写入stdout)。
如何保留
您可以将
从bash参考手册:
The exit status of a pipeline is the exit status of the last command
in the pipeline, unless thepipefail option is enabled (see The Set Builtin).
Ifpipefail is enabled, the pipeline's return status is the
value of the last (rightmost) command to exit with a non-zero status,
or zero if all commands exit successfully.
例子:
1 2 3 4 5 | $ false | tee /dev/null ; echo $? 0 $ set -o pipefail $ false | tee /dev/null ; echo $? 1 |
要恢复原始管道设置,请执行以下操作:
1 | $ set +o pipefail |
因为您运行的是
1 2 | mvn clean install $@ | tee $logfile echo ${PIPESTATUS[0]} |
您可以运行mvn命令并缓存退出代码…我将使用"false"命令作为示例。
1 2 3 | $ { false ; echo $? > /tmp/false.status ; } | tee $logfile $ cat /tmp/false.status 1 |
这样,您就可以使用状态文件内容做出进一步的决定。
我现在很好奇是否有一种更雄辩的方式来实现这一点。
解决方法(注:在Frederic的解决方案中有一个性能更好的解决方案):
1 2 3 4 | f=`mktemp` (mvn clean install $@; echo $?>$f) | tee $logfile e=`cat $f` #error in variable e rm $f |