背景
この[ 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
の変更は、ここではコマンド置換に影響を与えたのか?
サブシェルで変更された 'PATH' *を変更したサブシェルの' PATH' *に対する変更を混乱させると思います。 – chepner
@chepner:実際にPATHは環境変数であり、変更を有効にするためにエクスポートする必要はないということを見落としました。 – sjsam
ああ、OK。変数を「エクスポートする」というのは実際にはその名前をマークすることを意味し、その名前に関連付けられた*値*が子プロセスの環境に追加されることに留意してください。環境変数は、環境から初期化された変数であり、自動的にエクスポートされます。 – chepner