$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:.

答え2

この記事を読むことをお勧めします記事

シェル変数と環境変数の間には大きな違いがあります。環境要因の一つであり、すでにエクスポートしています。(デフォルトでは)したがって、これを変更すると、使用している現在のシェルと他のすべてのシェル(すべてのサブシェルまたはプロセス)が影響を受けます。

コマンドが見つかったときにシステムが確認するディレクトリのリスト。したがって、変更または追加したい場合でも、PATH="$PATH:...コマンドを実行するための元のパスが必要なので、使用することをお勧めしますが、完全に変更する場合は、絶対パスを入力してコマンドを使用する必要があります。たとえば/bin/pwd

しかし、金持ちエクスポートした内容はシェルやプロセスには影響しません。環境変数にしようとしましたが、有効な項目を定義していないため、シェルまたはプロセスにどのような影響があるのか​​わかりません。実際には、これはいくつかの一時データを追跡するために自分の必要に応じて定義したものなので、これをシェル変数として保持することをお勧めします。たとえば、数学プロジェクトを実行するときは、いくつかを定義して短時間で使用する必要があるため、エクスポートせずにいくつかのシェル変数を設定するだけです。

私は正しいことを願っていますが、特定の記事を読んで完全に理解できるように、いくつかの変数を変更することをお勧めします。ところで、環境変数を永続的に維持するには、その変数.bashrcまたは.bash_profile

関連情報