终端中的括号和大括号之间的区别?

终端中的括号和大括号之间的区别?
( du /etc; du /var; ) > tmp.txt

{ du /etc; du /var; } > tmp.txt

() 和 {} 有区别吗?

tmp.txt 的输出似乎完全相同,我想知道我是否在这里遗漏了一些东西。

答案1

括号使命令在子 shell 中运行。

大括号使命令组合在一起,但不在子 shell 中。

鉴于您的示例不使用副作用,两者之间没有真正的区别。如果存在副作用,例如设置或修改 shell 变量,则存在差异,因为当子 shell 结束时,应用到子 shell 的此类副作用将被忘记。

要了解“副作用”,请参阅以下示例:

使用括号()

v="test"; 
( echo $v; v="modified"; echo $v; ); 
echo $v;

# output:
#   test
#   modified
#   test

使用花括号{}

v="test"; 
{ echo $v; v="modified"; echo $v; }; 
echo $v;

# output:
#   test
#   modified
#   modified

然而,如果您仔细观察并比较不同 shell 实现的行为,就会变得令人困惑:

例如,Bourne Shell 在子 shell 中运行分组命令,以防出现 I/O 重定向,ksh93 通过实现虚拟子 shell 行为(通过创建新参数的临时副本来完成)来避免使用子 shell。这是否总是 100% 正确尚不清楚,ksh93 Version M 1993-12-28 s+从 2009 年开始,例如错误地实现了 $(...) 并且 $(alias a=b) 影响了主 shell。

所以一般来说:如果您对特定方面感兴趣,请小心并检查您的 shell 的实际行为。

相关内容