2013-07-19 30 views
11

在bash中對應於pipefail的破折號外殼中是否有類似的選項?相當於破折號外殼中的pipefail

或者,如果管道中的某個命令失敗(但不會在其上設置-e會退出),則獲取非零狀態的任何其他方式。

使其更清晰,這裏是什麼,我想實現一個例子:

在樣品調試的makefile,我的規則是這樣的:

set -o pipefail; gcc -Wall $$f.c -o $$f 2>&1 | tee err; if [ $$? -ne 0 ]; then vim -o $$f.c err; ./$$f; fi; 

基本上它運行打開文件時出錯和錯誤的源文件,並在沒有錯誤時運行程序。保存我一些打字。上面的代碼片段在bash上運行良好,但是我的新版Ubunty系統使用的短劃線似乎不支持pipefail選項。

我基本上要失敗的狀態,如果低於命令組的第一部分失敗:

gcc -Wall $$f.c -o $$f 2>&1 | tee err 

,這樣我可以使用的IF語句。

有沒有其他的方法來實現它?

謝謝!

+1

爲什麼不乾脆擺脫'tee'的? '如果gcc -Wall $$ f.c -o $$ f> $$ f.log 2>&1;然後cat $$ f.log; ./$$f; else vim -o $$ f.c $$ f.log; (或者,在Ubunty上安裝'bash',它只是一個易於獲取的版本。) – rici

+0

@rici謝謝!我正在使用T恤,因爲我還希望將stderr輸出打印到屏幕上 - 主要是查看是否有任何警告。但如果沒有其他方法,我可能會改用你的建議。關於安裝bash:我假設(沒有任何研究)dash從bash向前邁進了一步,所以我不想切換回去,但現在看起來可能不一定是這樣。我會更詳細地瞭解這些差異,然後再作出決定。再次感謝您的指點! – Lavya

+1

我希望上面提到的set -e會給我提供set -o pipefail的破折號,但不是這樣的: '$ dash -c'set -e; false |貓'; echo $? $' –

回答

6

的「股票」的答案PIPESTATUS/pipefail的POSIX實現是在comp.unix.shell FAQ Q11

+3

這並不回答問題。本文檔描述如何將管道命令的退出代碼放入單獨的變量中。但是這與手頭的問題相距甚遠,希望shell在任何管道命令失敗後自動退出。 「RTFM」只有在「FM」實際回答問題時纔有效。 – vog