2012-07-24 48 views
2

如果函數失敗,我想退出腳本。通常情況下這不是問題,但如果使用工藝替代,則會成爲問題。Bash退出和進程替換

$ cat test.sh 
#!/bin/bash 

foo(){ 
    [ "$1" ] && echo pass || exit 
} 

read < <(foo 123) 
read < <(foo) 
echo 'SHOULD NOT SEE THIS' 

$ ./test.sh 
SHOULD NOT SEE THIS 

基於CodeGnome’s answer這似乎工作

$ cat test.sh 
#!/bin/bash 

foo(){ 
    [ "$1" ] && echo pass || exit 
} 

read < <(foo 123) || exit 
echo 'SHOULD SEE THIS' 
read < <(foo) || exit 
echo 'SHOULD NOT SEE THIS' 

$ ./test.sh 
SHOULD SEE THIS 
+0

提示:您的foo構建不會評估您的想法。正如所寫,您的foo函數將始終返回true。你可能希望foo包含'{test -n「$ 1」&& echo pass; } ||退出1'。 – 2012-07-24 00:50:25

回答

2

您可以使用set -e退出任何失敗的腳本。在較小的腳本中這通常是足夠的,但缺乏粒度。

您也可以直接檢查任何命令或函數的返回狀態,或者檢查$?變量。例如:

foo() { 
    return 1 
} 

foo || { echo "Return status: $?"; exit 1; } 
+1

嚴格來說,'$?'將包含'read'而不是'foo'的退出碼。如果獲得'foo'的退出代碼非常重要,我認爲你只需要避免進程替換。 – chepner 2012-07-24 00:47:08

+0

這不僅僅是因爲'read'在EOF上返回非零值嗎?我認爲在一般情況下,即使使用'errexit',流程替換也不會使父命令失敗。 – 2016-09-24 10:41:54