概要
シェル変数と環境変数について調べる機会があったので、
備忘録兼誰かの役に立てばと思い書きました。
環境変数
環境変数は、例えば「PATHを通す」のPATHがその一例です。
他にも
$ cd
で移動する先はHOMEという名前で環境変数として保存されていたりします。
そのようなもともと用意されている環境変数の他に、自分でも環境変数を設定することができます。
環境変数は以下のコマンドで確認することができます。
$ export
また、$環境変数
とすればその値を取り出すこともできます。
試しに以下のようにコマンドを打てば、cd の行き先が表示されます。
$ echo $HOME
環境変数の追加は、例えば以下のように行うことができます。
export a=b
このコマンドを実行したあとにexport
を実行すれば、aが環境変数として登録されていることが確認できるはずです。
※あとでコマンドはまとめてご紹介します。
シェル変数
同じ「変数」という字がついていますが、シェル変数は環境変数とは別物です。
例えばシェル変数は以下のように定義できます。
b=c
環境変数のときと同様に$b
でその中身をとりだすことができるので
echo $b
とすれば、cと出力されます。
しかし、環境変数ではないので、export
を実行してもその一覧にbはいません。
環境変数とシェル変数の違い
では、環境変数とシェル変数は何が違うのかというと、スコープが違います。
(他にもあるかもしれませんが、とりあえず目についたものはこれだけでした)
具体的には、以下のような違いがあります。
環境変数:基本的に、親プロセスから子プロセスに引き継がれる。
シェル変数:基本的に、親プロセスから子プロセスには引き継がれない。
これは例えば以下のように確認できます。
$ c=shell_var
$ export d=env_var
bash
bash$ echo $c
bash$ echo $d
env_var
bash$ exit
exit
$ echo $c
shell_var
$ echo $d
env_var
ここではまず、シェル変数としてc、環境変数としてdを定義しています。
そのあと、bashをひらいて、その中でcとdの値を表示しようとすると、dの方は表示ができます。
次にexitコマンドでひらいたbashを閉じて元の場所に戻ってからcとdを表示すると、どちらも表示することができます。
このように、スコープが違うことが、性質として1つの違う点になります。
コマンド
性質としての違いは述べましたが、もちろん使用するコマンドも違っているので、最後にそのご紹介をします。
環境変数の確認
環境変数は以下の2つのコマンドどちらでも確認ができます。
$ export
$ env
しかし、envでは値を入れていない環境変数は表示されません。
環境変数とシェル変数の確認
以下の2つのコマンドは、環境変数もシェル変数もすべて表示されます。
$ set
$ declare
環境変数の定義
$ export a=b
以下のようにすると、aがすでにシェル変数の場合そのまま環境変数として定義でき、
もしそうでないなら、値は入れずに変数の定義だけ行うこともできます。
$ export a
シェル変数の定義
$ a=b
$ declare a=b
以下のようにすれば、値は入れずに変数の定義だけ行うこともできます。
$ declare a
環境変数とシェル変数の値の表示
$ echo $a
また、以下のようにしても、環境変数の値を表示することができます。
$ printenv a
環境変数とシェル変数の削除
$ unset a
参考
- https://www.webzoit.net/hp/it/internet/homepage/env/cs/server/os/type/unix/linux/shell/kind/sh_bash/environment/
- https://qiita.com/kure/items/f76d8242b97280a247a1
- https://qiita.com/angel_p_57/items/480e3fd4552e52199835
- https://qiita.com/viola/items/606816827e2e62995194
- https://www.atmarkit.co.jp/ait/articles/1801/12/news015.html