2015-04-24 65 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