( du /etc; du /var; ) > tmp.txt
{ du /etc; du /var; } > tmp.txt
()と{}の間に違いはありますか?
tmp.txtの出力はまったく同じようですが、ここに何か欠けているものがあるかどうか疑問に思います。
答え1
括弧を使用すると、コマンドはサブシェルで実行されます。
グループコマンドは一緒に中括弧で囲まれますが、サブシェル内では束縛されません。
あなたの例が副作用を使用しないことを考えると、2つの間に実際の違いはありません。シェル変数の設定や変更などの副作用がある場合には、サブシェルに適用された副作用がサブシェルが終了すると忘れてしまうため、違いがあります。
「副作用」を理解するには、次の例を参照してください。
括弧を使用してください()
:
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
しかし、異なるシェル実装の動作を詳しく見て比較すると混乱します。
たとえば、Bourne ShellはI / Oリダイレクトを防ぐためにサブシェルでグループ化されたコマンドを実行し、ksh93は新しいパラメータの一時コピーを作成して仮想サブシェルの動作を実装することによってサブシェルの使用を防ぎます。これが常に100%正しいかどうかは不明です。ksh93 Version M 1993-12-28 s+
2009年現在、$(...)が誤って実装され、$(alias a=b)がメインシェルに影響を与えました。
したがって、一般的に特定の側面に興味がある場合は、注意してシェルの実際の動作を確認してください。