web-dev-qa-db-ja.com

括弧はコマンドラインでどのように解釈されますか?

grubの設定方法を読んでいるときに、次の2つの構文のいずれかを使用する必要があると主張する記事を見つけました。

echo \(hd0,0\) >> /boot/grub/grub.conf

または

echo '(hd0,0)' >> /boot/grub/grub.conf

コマンドラインでは、括弧は特別な方法で解釈されるからです。括弧の何が特別なのですか?彼らはどのように解釈されますか?

47
Steve Brown

括弧はbashのサブシェルを示します。 man bashページを引用するには:

(list)    list  is  executed  in  a  subshell  environment (see COMMAND
          EXECUTION ENVIRONMENT below).  Variable assignments and builtin 
          commands that affect the Shell's environment do not remain in 
          effect after the command completes.  The return status is the
          exit status of list.

ここで、listは、通常の一連のコマンドです。

これは実際には非常に移植性があり、bashだけに固有のものではありません。 POSIXシェルコマンド言語仕様 には、(compound-list)構文に関する次の説明があります。

サブシェル環境でcompound-listを実行します。 Shell Execution Environment を参照してください。環境に影響を与える変数の割り当てと組み込みコマンドは、リストの終了後も有効になりません。

48
jw013

括弧の間に埋め込まれたコマンドリストは、サブシェルとして実行されます。

サブシェルの変数は、サブシェルのコードブロックの外には表示されません。親プロセス、サブシェルを起動したシェルからはアクセスできません。これらは、事実上、ローカル変数です。

Linuxtopia-Chapter 20. Subshel​​ls を参照してください

12
mark