linux 括号内的`exit '不退出脚本

wvt8vs2t  于 2023-02-21  发布在  Linux
关注(0)|答案(4)|浏览(209)

这里有一个简单的问题。为什么它的行为不像我想象的那样:

(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命令。
很明显,圆括号出于某种原因影响了命令,我的问题是为什么?

r8xiu3jd

r8xiu3jd1#

圆括号在子shell中执行其内容,因此退出的是子shell。
您通常可以使用另一个&&或使用{}代替()来实现相同的效果。

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

或者

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

yqkkidmi2#

http://tldp.org/LDP/abs/html/subshells.html开始
嵌入在圆括号中的命令列表作为子shell运行。

( command1; command2; command3; ... )

花括号中的代码块不会启动子shell。

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

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

1l5u6lss

1l5u6lss3#

( ... )的内容是在一个子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
xu3bshqb

xu3bshqb4#

只要去掉圆括号,它就应该能做你想做的事情。
圆括号相当于将其内容放入另一个shell脚本,其中exit只是退出该shell脚本。

相关问题