括号中的 `exit` 无法退出脚本。

15
这里有一个简单的问题。为什么这个不按照我想象中的方式运作:
(echo "Test 1"; exit) && echo "Test 2"

...or...

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

运行这两个代码片段中的任意一个都会导致脚本继续执行,尽管有明确的exit命令。

显然,括号出于某种原因影响了命令,我的问题是为什么?

4个回答

20

括号会在子shell中执行其内容,因此是子shell退出了,而不是当前的shell退出。

通常情况下,您可以使用另一个 && 或使用 {} 代替 () 来实现相同的效果。

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

或者

echo "Test 1" && exit && echo "Test 2"

如何在不使用上述“子shell”的情况下完成上述操作? - jduncanator
通过Kevin提供的这两个示例,您将不使用子shell ;) - Idriss Neumann
3
只需花费我5分钟时间:在闭括号前的分号是必需的,如果缺少它,你将会收到一个语法错误(可能是因为bash认为}是前一个命令的参数)。 - ChristophK

5

http://tldp.org/LDP/abs/html/subshells.html中得知,括号内的命令列表将作为子shell运行。

( command1; command2; command3; ... )

花括号之间的代码块不会启动子 shell。
{ command1; command2; command3; . . . commandN; }

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

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

-1

只需删除括号,它就会按照您的要求执行。

括号相当于将它们的内容放入另一个shell脚本中,在那里exit只是退出该shell脚本。


仅仅移除括号是不够的,因为运算符的优先级。|| 只会在其旁边的第一个参数中起作用。尝试使用 BOOL=trueBOOL=false 运行 BOOL || echo msg ; echo exit - DrBeco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接