環境変数とシェル変数の違い

自分なりの理解をまとめておく。

環境変数

プロセスが持つ変数。

親プロセスの持つ環境変数は子プロセスへと引き継がれるが、その逆はない。1

プロセスは自分自身の環境変数を自由に書き換えることができ、例えばenvコマンドなどは環境変数を書き換えたうえで指定されたコマンドを実行するため、書き換えた環境変数が子プロセスへ引き継がれている。

シェル変数

bashなどのシェルが管理している環境変数もどき。

環境変数ではないので、子プロセスから参照できない。
C言語のgetenv関数やmainの第三引数に入る環境変数への配列にもシェル変数は含まれていなかった。

環境変数とシェル変数の違い

環境変数はOSが管理しているが、シェル変数はシェルが管理している。

全ての違いはこれに起因するもの。


  1. bashでは、PWDという環境変数が存在し、まるでcdコマンドがbash環境変数を書き換えているように見えるが、cdコマンド自体がbashの組み込みコマンドである(つまり別プロセスではない)。