シェル変数と環境変数の違いを理解する

はじめに

自前で開発環境を整えようとしているうちに泥沼にはまってしまいました.

直そうとしているうちにLinuxについてまだ理解していない点が沢山あることに思い至ったので,こちら↓の本を参考にシェル変数と環境変数の違いについて整理しました.

www.amazon.co.jp

おそらく基本事項だと思うのですが,体系的に調べたことがないと意外と知らないんですよね.

本題

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

  • シェルで用いる変数は「シェル変数である」「環境変数である」のどちらかの状態をとる.
  • 同一の変数がシェル変数でありしかも環境変数でもあるということはない.
  • シェル変数は現在開かれているシェルでのみ有効.
    • 現在のシェル上で新しく別のシェルを開いた場合,新しいシェルにシェル変数は引き継がれない.
  • 環境変数は現在のシェル上で新しく開いた別のシェルにも引き継がれる.
    • 単に新しくシェルを開く際に現在のシェルからコピーされて引き継がれるというだけ.
    • グローバル変数のような機能は持たない
    • たとえば新しいシェル上で環境変数に変更を加えても,もとのシェルには反映されない.
    • もちろん現在のシェルと無関係のシェルや他のユーザーに影響したりすることもない.
  • export 変数名 で既存のシェル変数を環境変数に変更できる.
  • export -n 変数名 で既存の環境変数をシェル変数に変更できる(bashの場合.zshでは -n オプションは無効?)

具体例

$ HOGE=42         # シェル①でシェル変数を設定
$ echo $HOGE
42
$ bash            # 別のシェル②を起動させると...
$ echo $HOGE      # シェル②にシェル変数は引き継がれない

$ exit            # シェル①に戻る
$ export HOGE     # HOGEを環境変数に変える
$ bash            # 別のシェル③を起動させると...
$ echo $HOGE      # 環境変数は引き継がれる
42
$ HOGE=84         # 環境変数を書き換えてから
$ exit            # もとのシェル①に戻っても
$ echo $HOGE      # 環境変数の変更は反映されない
42
$ HOGE=12345      # 環境変数を書き換える
$ bash            # もう一度別のシェル④をさらに起動させると...
$ echo $HOGE      # 環境変数の変更は引き継がれている
12345
$ export -n HOGE  # HOGEを環境変数からシェル変数に戻してから
$ bash            # さらに別のシェル⑤を起動させると…
$ echo $HOGE      # HOGEが引き継がれなくなっている
$ exit                    # シェル④に戻ると
$ printenv | grep HOGE    # たしかにHOGEは環境変数でなくなっている

$ exit                    # もとのシェル①に戻る
$ printenv | grep HOGE    # シェル①ではHOGEは環境変数のまま
HOGE=12345