シェル変数と環境変数の違いについてのメモです。 ついでに、コマンドの先頭で指定する変数についても調べました。
シェル変数
設定されたシェルだけが使用する変数です。 子プロセスには引き継がれません。
LPIC レベル1 スピードマスター問題集 より引用
環境変数
設定されたシェルとそのシェルで起動したプログラムが使用する変数です。 子プロセスに引き継がれます。
exportコマンドにより定義します。
LPIC レベル1 スピードマスター問題集 より引用
シェル変数と環境変数の違い
違いを一言で説明すると、子プロセスに引き継がれるかどうかです。
- シェル変数: 変数は子プロセスに引き継がれない
- 環境変数: 変数は子プロセスに引き継がれる
実際に実験してみる
# シェル変数を定義する $ TEST=shell_var $ echo $TEST shell_var $ cat /tmp/test.sh echo $TEST # 何も出力されない $ sh /tmp/test.sh # 環境変数の定義 $ export TEST=env_var $ sh /tmp/test.sh env_var
変数定義とコマンド実行を同時に行なうパターン
手抜きで変数セットしたいときに多用する、コマンドの先頭で変数を定義するやつです。
$ cat /tmp/test.sh echo $TEST $ TEST=foo_bar sh /tmp/test.sh foo_bar
これは何変数に該当するのか気になって調べてみたら、同じ疑問を抱いていた先駆者の方がいらっしゃいました。 実験結果では、環境変数になるとのことです。 なるほど。
追加で気になることがあり実験してみたのですが、コマンドの先頭で定義した変数は、コマンド実行が終わったら消滅するようです。
$ TEST=foo_bar sh /tmp/test.sh foo_bar # 何も出力されない $ echo $TEST $
まとめ
シェル変数と環境変数の違いは、子プロセスに変数が引き継がれるかどうかです。
また、コマンドの先頭で定義する変数は環境変数のように振る舞いますが、コマンド実行が終わると消滅することがわかりました。