在bash的联机帮助页面中,在" Compound Commands"部分,有以下两个条目:
(list)列表在子shell环境中执行(请参阅下面的COMMAND EXECUTION ENVIRONMENT)。影响shell环境的变量赋值和内置命令在命令完成后不会保持有效。返回状态是列表的退出状态。
(expression)返回表达式的值。这可以用来覆盖运算符的正常优先级。
我能看到的唯一区别是,在一个中,括号旁边没有空格,而另一个则是。这实际上区分了分组与子shell,还是依赖于上下文?
换句话说,如果我跑
if ! [ 2 -eq 2 ] || ( [ 2 -eq 2 ] && [ 4 -eq 4 ] ); then echo "hello"; fi
这只是对条件进行分组或在子shell中运行吗?
答案 0 :(得分:4)
这些条目的相关背景是相关的。
后者位于[[
构造的文档中,并且正在记录该构造在其参数上的行为。
前者正在讨论顶级shell复合命令构造(如[[
构造本身)并引入了一个子shell。
稍后在手册页中稍后的test
/ [
命令的描述中再次出现(但这基本上与[[
讨论相同)。
要在当前shell中进行分组,可以使用花括号:
if ! [ 2 -eq 2 ] || { [ 2 -eq 2 ] && [ 4 -eq 4 ]; }; then
...
fi
(注意括号内侧和额外分号周围的空格,这两者都是必要的。)