2012-07-24 46 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