2012-12-10 50 views
0

我想這樣做:檢查RCODE和管道在bash

./first.sh 
if [ $? -ne 0 ]; then 
exit 
fi 
# pipe output of first.sh to second.sh 

所以second.sh不應該運行,除非first.sh成功,但我真的不知道從哪裏管first.sh的輸出的平均時間。

+0

使用臨時文件? – frankc

+0

光盤空間使用情況,併發問題等。雖然這確實有用,但我猜這裏有更好的做法。 – djechlin

+0

我不那麼誠實。它非常標準。您可以通過執行tmpstr =「$(./ first.sh)」將輸出存儲在變量中,然後執行echo「$ tmpstr」| second.sh但是如果你不小心的話,這可能會引入一些逃避的問題。你幾乎必須做這些事情之一,因爲任何使用管道的變體都將開始在first.sh完成之前將輸入發送到second.sh – frankc

回答

1

爲什麼不把它轉儲到一個文件,然後寫入second.sh如果first.sh成功?

./first.sh > /tmp/first.pid 
if [ $? -ne 0 ]; then 
    exit 
fi 
./second.sh < /tmp/first.pid 

如果併發是一個問題,您可能希望用pid或類似的範圍來對文件進行範圍。

+0

真的沒有更好的便攜方式。如果你還修正了'$?'的無用用法 - 我寫的是'if first.sh;那麼...'或者也許更現實一些'first.sh> /tmp/first.pid || {rm -f /tmp/first.pid;退出$?; }; second.sh tripleee

+0

良好的使用pid - 最好使用3或更高的文件描述符,但是這是使第一個和第二個進程同步的正確方法。 – djechlin

0

可以設置bash選項pipefail導致錯誤並退出時,管道中的命令無法報告:

set -e # Set exit on error 
set -o pipefail # Set exit on error to work with pipes 

Source of information

+0

但管道中的所有命令已經運行,因此second.sh已經部分運行。對他來說這可能是好的,但是他的語義與他發佈的不同 – frankc