5

在 bash 的手册页中,在“复合命令”部分下,有以下两个条目:

(list) list 在子shell 环境中执行(参见下面的命令执行环境)。影响 shell 环境的变量分配和内置命令在命令完成后不会保持有效。返回状态是列表的退出状态。

test在和下[[

( 表达式 ) 返回表达式的值。这可用于覆盖运算符的正常优先级。

我能看到的唯一区别是,在一个中,括号旁边没有空格,而在另一个中,它们有。这是真正区分分组与子外壳的原因,还是取决于上下文?

换句话说,如果我跑

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

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

4

1 回答 1

4

这些条目的上下文是相关的。

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

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

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

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

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

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

于 2015-03-25T16:35:31.530 回答