2013-07-19 106 views
1

我試圖讓這個呼叫殼牌:分析迴歸

TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f) 
M=$? 

的結果不幸的是,如果/mydir/不存在的$?結果仍然是「0」,像有沒有問題。我想得到而不是'0'如果find什麼也沒有返回。

我該怎麼辦?如果存在一個目錄在bash

+0

您的'rm' cmd上的'-f'可能會覆蓋任何有關「錯誤 - ish」條件的報告。祝你好運。 – shellter

+2

dupe of http://stackoverflow.com/questions/14923387/is-there-a-way-to-catch-a-failure-in-piped-commands其本身就是http://stackoverflow.com/questions/1550933 /追趕錯誤碼功能於一個殼管 –

回答

2

由於link

的bash版本3引入了一個選項,它改變了管道的退出代碼的行爲,並報告管道作爲最後程序的退出代碼退出代碼返回非零退出代碼。只要測試程序之後的程序都沒有報告非零退出代碼,管道將報告其退出代碼爲測試程序的代碼。要啓用該選項,只需執行:

set -o pipefail 

然後

TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f) 
M=$? 

將表現不同,並承認錯誤。 參見StackOverflow上 以前post

最佳,

傑克。

0

檢查:

if [ ! -d "mydir" ]; then 
    exit 1 #or whatever you want, control will stop here 
fi 
TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f) 
... 
1

您可以啓用bashpipefail選項。文檔(來自help set):

pipefail  the return value of a pipeline is the status of 
       the last command to exit with a non-zero status, 
       or zero if no command exited with a non-zero status 

所以,你可以寫爲:

set -o pipefail 
TMP=$(find /mydir/ -type f -mmin +1440 | xargs --no-run-if-empty rm -f) 
M=$? 
set +o pipefail 

而且,你爲什麼裏面$(...)執行你的命令find?如果您不希望它輸出錯誤,請將STDERR重定向到/dev/null,並且最好將-r--no-run-if-empty標誌用於xargs,以避免在未接收到來自管道的任何輸入時運行該命令。