2015-04-24 66 views
2

有没有办法通过管道命令来复制其先前的命令退出状态?Bash管道命令及其返回

例如:

#/bin/bash 
(...) 
function customizedLog() { 
    # do something with the piped command output 
    exit <returned value from the last piped comand/script (script.sh)> 
} 

script.sh | customizedLog 
echo ${?} # here I wanna show the script exit value 
(...) 

我知道我可以简单地检查使用$返回{PIPESTATUS [0]},但我真的想这样做像customizedLog功能是不存在。

有什么想法?

回答

4

在bash:

set -o pipefail 

这将在管道返回最后一个非零退出状态,或零,如果在管道中的所有命令都成功。

set -o pipefail 
script.sh | customizedLog 
echo ${?} 

只要确保customizedLog成功(return 0),你应该拿起script.sh退出状态。用false | customizedLogtrue | customizedLog进行测试。

+1

这不是exactely了我的想象,但tottaly解决了我的问题!谢谢Jonathan – RLM

+0

如果必须以这种方式处理_multiple_管道,这尤其方便;作为一种特别的解决方案,OP自己的方法 - 尽管他忽视了它 - 值得重申:echo $ {PIPESTATUS [0]}提供了相同的结果,而无需更改全局shell选项(或者更简单地说,考虑到正在访问_first_数组元素,'echo $ PIPESTATUS'。 – mklement0

2

script.sh | customizedLog

上面将两个单独的进程中运行(或3,实际上 - customizedLog将在bash叉运行作为可以用一些验证等ps -T --forest)。据我所知,在UNIX进程模型中,唯一能够访问进程返回信息的进程是其父进程,因此定制日志无法检索到它。

所以,不,除非前面的命令是从穿过管道的退出状态(例如,作为最后一行)的包装命令来运行:

(command ; echo $?) | piped_command_that_is_aware_of_such_an_arrangement