bash 中的括号 - 子 shell 与分组

Parenthesis in bash - subshell vs grouping

在 bash 的联机帮助页中,在“Compound Commands”部分下,有以下两个条目:

(list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below). Variable assignments and builtin commands that affect the shell's environment do not remain in effect after the command completes. The return status is the exit status of list.

test and [[以下:

( expression ) Returns the value of expression. This may be used to override the normal precedence of operators.

我能看到的唯一区别是,在一种情况下,括号旁边没有空格,而在另一种情况下,它们有。这实际上是分组与子 shell 的区别,还是取决于上下文?

换句话说,如果我运行

if ! [ 2 -eq 2 ] || ( [ 2 -eq 2 ] && [ 4 -eq 4 ] ); then echo "hello"; fi

这只是对条件进行分组还是 运行在子 shell 中进行分组?

这些条目的上下文相关。

后者在 [[ 构造的文档中,并记录了该构造在其参数上的行为。

前者正在讨论顶级 shell 复合命令构造(如 [[ 构造本身)并引入子 shell.

这在手册页后面对 test/[ 命令的描述中再次出现(但这基本上与 [[ 讨论相同)。

要在当前 shell 内进行分组,您可以使用花括号:

if ! [ 2 -eq 2 ] || { [ 2 -eq 2 ] && [ 4 -eq 4 ]; }; then
    ...
fi

(注意大括号内部的空格和额外的分号,它们都是必需的。)