括号内的`exit`不会退出脚本

时间:2013-11-10 06:02:44

标签: linux bash

这是一个简单的问题。为什么这不符合我的想法:

(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命令,但运行这两个片段中的任何一个都会导致脚本继续执行。

显然,由于某些原因,括号正在影响命令,我的问题是为什么?

4 个答案:

答案 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。