シェル変数
シェル変数は、スコープが現在のシェルセッション(対話型シェルセッションやスクリプトなど)にある変数です。
未使用の名前に値を割り当てることにより、シェル変数を作成できます。
var="hello"
シェル変数の使用は、現在のセッションのデータを追跡することです。シェル変数には通常、小文字の名前が付いています。
環境変数
環境変数は、エクスポートされたシェル変数です。つまり、変数として作成されたシェルセッションだけでなく、そのセッションから開始されたプロセス(シェルだけでなく)でも変数として表示されます。
VAR="hello" # shell variable created
export VAR # variable now part of the environment
または
export VAR="hello"
シェル変数がエクスポートされると、設定が解除されるまで、またはその「エクスポートプロパティ」が(export -n
inでbash
)削除されるまでエクスポートされたままなので、通常は再エクスポートする必要はありません。変数を設定解除すると、unset
それが削除されます(環境変数であるかどうかは関係ありません)。
配列および連想ハッシュbash
およびその他のシェルは、環境変数になるためにエクスポートされない場合があります。環境変数は、値が文字列である単純な変数である必要があり、多くの場合、名前は大文字で構成されています。
環境変数を使用すると、現在のシェルセッションのデータを追跡するだけでなく、開始されたプロセスがそのデータの一部を取ることができます。この典型的なケースはPATH
環境変数です。これはシェルで設定され、後でプログラムへのフルパスを指定せずにプログラムを起動したい任意のプログラムで使用されます。
プロセス内の環境変数のコレクションは、多くの場合「プロセスの環境」と呼ばれます。各プロセスには独自の環境があります。
環境変数は「転送」のみ可能です。つまり、子プロセスは親プロセスの環境変数を変更できません。また、起動時に子プロセスの環境を設定する以外は、親プロセスは既存の環境を変更できません。子プロセス。
環境変数はenv
(引数なしで)リストできます。それ以外は、シェルセッションではエクスポートされていないシェル変数と同じように見えます。他のほとんどのプログラミング言語は通常「通常の」変数と環境変数を混在させないため、これはシェルにとって少し特別です(以下を参照)。
env
また、現在のセッションで設定せずに、プロセスの環境で1つまたは複数の環境変数の値を設定するために使用できます。
env CC=clang CXX=clang++ make
これは、開始make
、環境変数とCC
値に設定clang
してCXX
に設定clang++
。
プロセスの環境をクリアするためにも使用できます。
env -i bash
これは開始されますbash
が、現在の環境を新しいbash
プロセスに転送しません(シェル初期化スクリプトから新しい環境変数を作成するため、環境変数はまだあります)。
違いの例
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
他の言語
ほとんどのプログラミング言語には、環境変数の取得と設定を可能にするライブラリ関数があります。環境変数は単純なキーと値の関係として保存されるため、通常は言語の「変数」ではありません。プログラムは、キー(環境変数の名前)に対応する値(常に文字列)を取得できますが、その値を整数または言語が値に期待するデータ型に変換する必要があります。
Cは、環境変数を使用してアクセスすることができるgetenv()
、setenv()
、putenv()
およびunsetenv()
。これらのルーチンで作成された変数は、Cプログラムが開始するプロセスによって同じ方法で継承されます。
他の言語には%ENV
、Perl のハッシュや、ENVIRON
ほとんどの実装の連想配列など、同じことを達成するための特別なデータ構造がありawk
ます。