2016-06-30 12 views
2

背景

この[ article ]は言う:

コマンド置換は、コマンドの出力に展開されます。これらのコマンドは サブシェルで実行されます。..

しかし、bashのマニュアルは、そのコマンド置換セクションのsubshellについては何も言いません。

$ ps 
    PID TTY   TIME CMD 
26483 pts/25 00:00:00 bash 
26866 pts/25 00:00:00 ps 
$ hpid="$(ps | grep bash)" 
$ echo "$hpid" 
26483 pts/25 00:00:00 bash 
26899 pts/25 00:00:00 bash 

以下

私のテストは、PID 26899で新しいシェルはコマンドの置換中に生成されたことを示しています。この時点で、私はPATH環境変数を変更しました。私はエラーが殻を助けPATH環境変数の変更によるものであることを理解し

Command 'cut' is available in '/usr/bin/cut' 
The command could not be located because '/usr/bin' is not included in the PATH environment variable. 
cut: command not found 

$ PATH="/some/rogue/path" 

は、以下のようなものでした:

VAR="$(echo "Do|Die" | cut -d"|" -f 2)" 

をし、以下のエラーを得ましたバイナリを探します。しかし、私はこれをコマンド置換と一緒に読むと混乱します。

$(..)によってサブシェルが起動された場合、PATH環境変数が無傷であるべきであり(この場合cut)バイナリを指している必要がありので、bashが、それはcutバイナリを見つけることができないことを訴えるべきではありません。

質問

はどのようPATHの変更は、ここではコマンド置換に影響を与えたのか?

+1

サブシェルで変更された 'PATH' *を変更したサブシェルの' PATH' *に対する変更を混乱させると思います。 – chepner

+0

@chepner:実際にPATHは環境変数であり、変更を有効にするためにエクスポートする必要はないということを見落としました。 – sjsam

+2

ああ、OK。変数を「エクスポートする」というのは実際にはその名前をマークすることを意味し、その名前に関連付けられた*値*が子プロセスの環境に追加されることに留意してください。環境変数は、環境から初期化された変数であり、自動的にエクスポートされます。 – chepner

答えて

4

は例の下に考えてみましょう:

$ export PS1='\$\$=$$ \$ ' 
$$=30862 $ a=123 # Note: No export a here. 
$$=30862 $ echo $a 
123 
$$=30862 $ bash 
$$=31133 $ echo $a # Subshell explicitly created does not have it. 

$$=31133 $ exit 
$$=30862 $ echo $(eval 'echo $a') # This subshell however does inherit it. The single quote ensures that this is not evaluated by parent shell. 
123        # echo $(echo $a) would probably cause $a to be evaluated by parent shell. 
$$=30862 $ 

要するに、変数がエクスポートされていない場合でも、親シェルとして$(...)継承同じ環境によって生成されたサブシェル。 ($$でも親シェルと同じです)

+0

完璧!ドキュメントから、親シェルと同じ環境を継承してください。 – sjsam

+0

^^私は ': - 'を見つけることができませんでした。もう一度やり直してください... – anishsane

+0

いいえprobs ..時間をかけてください。 – sjsam

関連する問題