ㅏ。{ echo "Hello World"; } >outputfile
雨。( echo "Hello World" ) >outputfile
氏。./anothershell.sh
ディ。/bin/echo "Hello World"
どちらが正しいですか?そして、現在のシェルの同じプロセスでどのようなコマンドを実行できますか?
答え1
現在、シェルプロセス内ではAのみが実行されます。
paranehtese を使用してサブシェルを要求したため、B はサブシェルで実行されます。
C と D はどちらも外部コマンドの呼び出しであるため、現在のシェルプロセスの外部で実行されます。
答え2
あなたはこれをどのように証明できるかを何度も尋ねました。環境変数設定をプローブとして使用します。
export testvar=nope
{ echo "Hello World"; export testvar=yep; } >outputfile
printenv testvar
書くyep
export testvar=nope
( echo "Hello World"; export testvar=yep; ) >outputfile
printenv testvar
書くnope
(C)のスクリプトを編集し、(D)用に変更されたエコーをコンパイルする必要がありますが、その設定も作成されますnope
。グレンジャックマンケースコメント(E)同じプロセスで実行します。
答え3
あなたが見逃すことができる1つの違いは、Bが分岐することです(したがって別のプロセスです)、実際には実行されないことです(同じシェルのコピーなので、/ bin / shを見つけずにinitプログラムETCを再実行しません)。 。そして特別な規則があります(例えば、$$は元のシェルのpidです)。