$PATHを変更するとサブシェルに影響しますが、$fooを変更しても影響を受けないのはなぜですか?

$PATHを変更するとサブシェルに影響しますが、$fooを変更しても影響を受けないのはなぜですか?
$ unset foo
$ unset bar
$ echo $foo

$ echo $bar

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ foo=a
$ bar=b
$ export bar
$ echo $foo
a
$ echo $bar
b
$ PATH=
$ echo $PATH

$ /bin/bash
bash: lesspipe: No such file or directory
bash: dircolors: No such file or directory
bash: ls: No such file or directory
$ echo $foo

$ echo $bar
b
$ echo $PATH

$

ご覧のとおり、変更は$PATHサブシェルに影響し、export他の変数を編集する必要があります。なぜ?

ベストアンサー1

実際には2種類の変数があります。

  1. 環境変数
  2. シェル変数

状況をより複雑にするために、2つは同じように見え、コマンドを使用してシェル変数を環境変数に変換できますexport

このenvコマンドは、現在の環境変数のセットを表示します。

$ myvar=100
$ env | grep myvar
$ export myvar
$ env | grep myvar
myvar=100

コマンドの存続期間中に変数を一時的にエクスポートすることもできます。

$ env | grep anothervar
$ anothervar=100 env | grep anothervar
anothervar=100
$ env | grep anothervar
$ 

シェルが起動すると、複数の環境変数(0になる可能性があります)を継承します。

起動スクリプト(.bash_profileディレクトリ.bashrc内のファイル/etcなど)も変数を設定およびエクスポートできます。

最後に、環境が空の場合、シェル自体が環境変数のデフォルト値を設定できます。例えば

$ PATH=foo /bin/bash -c 'echo $PATH'
foo
$ PATH= /bin/bash -c 'echo $PATH'

$ unset PATH
$ /bin/bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

おすすめ記事