2013-11-10 21 views
6

这是一个简单的问题。为什么会出现这种不行为的方式,我认为它会:括号内的`exit`不会退出脚本

(echo "Test 1"; exit) && echo "Test 2" 

......或者......

VAR1=1 
VAR2=2 
[ $VAR1 == $VAR2 ] || (echo '$VAR1 does not equal $VAR2, exiting.'; exit) 
echo -e 'Well, I\'m still alive yo!' 

运行的是这两个中的问题将导致脚本执行继续,尽管明确exit命令。

很明显括号是由于某种原因影响命令,我的问题是为什么?

回答

7

圆括号在子外壳中执行其内容,因此它是退出的子外壳。

您通常可以使用另一个&&或使用{}而不是()实现相同的效果。

{ echo "Test 1"; exit; } && echo "Test 2" 

或者

echo "Test 1" && exit && echo "Test 2" 
+0

如何在不使用所述'subshel​​l'的情况下完成上述操作? – jduncanator

+0

用凯文给出的这两个例子,你不会使用子壳;) –

1

(...)内容在子Shell中执行,所以你只要exit这个壳。这种做法应该更好地为你和它更容易阅读的维持旁边的人一起去,打开你的脚本:

VAR1=1 
VAR2=2 
if [ $VAR1 == $VAR2 ] ; then 
    echo -e "Well, I'm still alive yo!" 
else 
    echo "$VAR1 does not equal $VAR2, exiting." 
    exit 
fi 
1

只是删除括号,它应该做你想做的。

括号相当于将其内容放入另一个shell脚本,其中exit刚刚退出该shell脚本。

0

http://tldp.org/LDP/abs/html/subshells.html

嵌入括号之间的命令列表运行作为一个子shell。

(command1; command2; command3; ...) 

大括号之间的代码块不会启动子shell。

{ command1; command2; command3; . . . commandN; } 

在第一情况下,退出正被子壳终止,并将控制返回到调用壳运行。