( 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 的实际行为。