このすみろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

シェル変数と環境変数とコマンドの先頭で指定する変数の違いについて - Linux

シェル変数と環境変数の違いについてのメモです。 ついでに、コマンドの先頭で指定する変数についても調べました。

シェル変数

設定されたシェルだけが使用する変数です。 子プロセスには引き継がれません。
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

これは何変数に該当するのか気になって調べてみたら、同じ疑問を抱いていた先駆者の方がいらっしゃいました。 実験結果では、環境変数になるとのことです。 なるほど。

blog.3qe.us

追加で気になることがあり実験してみたのですが、コマンドの先頭で定義した変数は、コマンド実行が終わったら消滅するようです。

$ TEST=foo_bar sh /tmp/test.sh
foo_bar
# 何も出力されない
$ echo $TEST

$

まとめ

シェル変数と環境変数の違いは、子プロセスに変数が引き継がれるかどうかです。

また、コマンドの先頭で定義する変数は環境変数のように振る舞いますが、コマンド実行が終わると消滅することがわかりました。