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

jdu*_*tor 9 linux bash

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

(echo "Test 1"; exit) && echo "Test 2"
Run Code Online (Sandbox Code Playgroud)

...要么...

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

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

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

Kev*_*vin 11

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

您通常可以使用另一个&&或使用{}而不是使用相同的效果().

{ echo "Test 1"; exit; } && echo "Test 2"
Run Code Online (Sandbox Code Playgroud)

要么

echo "Test 1" && exit && echo "Test 2"
Run Code Online (Sandbox Code Playgroud)

  • 因为它只花了我 5 分钟:右括号之前的分号不是可选的 - 如果缺少它,您将收到语法错误(大概是因为 bash 认为 } 是之前命令的参数) (3认同)

小智 6

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

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

( command1; command2; command3; ... )
Run Code Online (Sandbox Code Playgroud)

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

{ command1; command2; command3; . . . commandN; }
Run Code Online (Sandbox Code Playgroud)

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