{} と () を使用してグループのコマンドセットを実行します。

{} と () を使用してグループのコマンドセットを実行します。

私はこの記事を読みました:

答えは理解していますが、一連のコマンドを実行し{}()この投稿を作成するオプションがあります。

シナリオがある場合:いつ必須であり、{}その()逆も同様であり、その理由は何ですか?

答え1

2つの違いは、()サブシェルを作成することです。たとえば、次のことを試すことができます。

cd $HOME ; ls

このコマンドの出力には、現在のユーザーが所有しているファイルとディレクトリが一覧表示されます。

これで、サブシェルを使用して次のことを試すことができます。

( cd / ; ls ; ) ; ls

ここで私たちがすることはサブシェルを作ることです。(CD / ; ls)現在のディレクトリを変更し、/そのファイルとディレクトリを一覧表示します。その後、サブシェルが終了すると、現在のディレクトリのファイルが一覧表示されますが、これは/ディレクトリではありません。この場合、現在のディレクトリはユーザーのホームフォルダ($HOME)

()今行動を変えると{}変わります。

{ cd / ; ls ; } ; ls

ここで、出力には両方のコマンド/lsディレクトリのファイルとディレクトリが一覧表示されます。

別の例を見てみましょう。

( echo Subshell is $BASH_SUBSHELL ; ) ; echo Subshell is $BASH_SUBSHELL

これらのコマンドはそれぞれ次のようにエコーされます。

Subshell is 1
Subshell is 0

ご覧のとおり、環境変数を使用すると現在のサブシェルレベルを取得できるため、変更を使用する$BASH_SUBSHELL場合(必要に応じてネストされたサブシェルを使用できます)。()BASH_SUBSHELL

別の例は次のとおりです。

( vartmp=10 ; echo var is $vartmp ; ) ; echo var is $vartmp

この場合、出力は次のようになります。

var is 10
var is

ご覧のとおり、2番目の行$vartmpは空です。これは、サブシェルの実行が終了すると、すべての変数、関数、およびいくつかの変更(環境変数の変更など)がクリアされるため、正確です。したがって、サブシェルが終了した後に内容を表示したい場合は、$vartmp変数が存在しないため出力が空になります。

()このコマンドでを変更して、{}他の動作を確認できます。

関連情報