这是一个简单的问题。为什么这不符合我的想法:
(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
命令,但运行这两个片段中的任何一个都会导致脚本继续执行。
显然,由于某些原因,括号正在影响命令,我的问题是为什么?
答案 0 :(得分:11)
括号在子shell中执行它们的内容,因此它是退出的子shell。
您通常可以使用其他&&
或使用{}
代替()
获得相同的效果。
{ echo "Test 1"; exit; } && echo "Test 2"
或者
echo "Test 1" && exit && echo "Test 2"
答案 1 :(得分:1)
( ... )
的内容在子shell中执行,所以你只需要exit
这个shell。这种方法应该对您更有效,并且更容易阅读维护,以便下一个人出现并打开您的脚本:
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
答案 2 :(得分:1)
只需删除括号,就可以执行您想要的操作。
括号相当于将其内容放入另一个shell脚本中,exit
只退出该shell脚本。
答案 3 :(得分:1)
来自http://tldp.org/LDP/abs/html/subshells.html
括号中嵌入的命令列表作为子shell运行。
( command1; command2; command3; ... )
大括号之间的代码块不会启动子shell。
{ command1; command2; command3; . . . commandN; }
在第一种情况下,退出由子shell运行,子shell终止并将控制权返回给调用shell。