这里有一个简单的问题。为什么它的行为不像我想象的那样:
(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条答案
按热度按时间r8xiu3jd1#
圆括号在子shell中执行其内容,因此退出的是子shell。
您通常可以使用另一个
&&
或使用{}
代替()
来实现相同的效果。或者
yqkkidmi2#
从http://tldp.org/LDP/abs/html/subshells.html开始
嵌入在圆括号中的命令列表作为子shell运行。
花括号中的代码块不会启动子shell。
在第一种情况下,exit由子shell运行,子shell终止并将控制返回给调用shell。
1l5u6lss3#
( ... )
的内容是在一个子shell中执行的,所以你只需要exit
这个shell,这种方法对你来说会更好,而且对于下一个来打开你的脚本的人来说,它更容易阅读:xu3bshqb4#
只要去掉圆括号,它就应该能做你想做的事情。
圆括号相当于将其内容放入另一个shell脚本,其中
exit
只是退出该shell脚本。