bash中的括号 - 子shell与分组

时间:2015-03-25 16:32:19

标签: bash grouping subshell

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

  

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

并在test[[下:

  

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

我能看到的唯一区别是,在一个中,括号旁边没有空格,而另一个则是。这实际上区分了分组与子shell,还是依赖于上下文?

换句话说,如果我跑

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

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

1 个答案:

答案 0 :(得分:4)

这些条目的相关背景是相关的。

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

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

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

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

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

(注意括号内侧和额外分号周围的空格,这两者都是必要的。)