私はこの記事を読みました:
答えは理解していますが、一連のコマンドを実行し{}
て()
この投稿を作成するオプションがあります。
シナリオがある場合:いつ必須であり、{}
その()
逆も同様であり、その理由は何ですか?
答え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
変数が存在しないため出力が空になります。
()
このコマンドでを変更して、{}
他の動作を確認できます。