12

这是一个简单的问题。为什么这不像我认为的那样:

(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

4 回答 4

17

括号在子shell中执行它们的内容,因此退出的是子shell。

您通常会使用另一个&&或使用{}而不是().

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

或者

echo "Test 1" && exit && echo "Test 2"
于 2013-11-10T06:05:19.317 回答
3

来自http://tldp.org/LDP/abs/html/subshel​​ls.html

嵌入在括号之间的命令列表作为子外壳运行。

( command1; command2; command3; ... )

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

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

在第一种情况下,出口由子 shell 运行,该子 shell 终止并将控制权返回给调用 shell。

于 2017-11-07T08:39:59.023 回答
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
于 2013-11-10T06:10:32.403 回答
0

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

括号等效于将它们的内容放入另一个 shell 脚本,其中exit刚刚退出该 shell 脚本。

于 2013-11-10T06:10:47.413 回答