Lambdaカクテル

Common Lispを書くMT-03ライダー(初心者)です

bash: コマンドの先頭に付ける変数は環境変数になるのかただのシェル変数なのか

こういうコマンド呼び出しをすることがあると思う。

$ FOO=BAR ./command.sh

ところでこのFOOは環境変数なのだろうか,それともただのシェル変数なのだろうか?

TL;DR

  • 環境変数だよ

環境変数とシェル変数

そもそも環境変数とシェル変数についておさらい。

環境変数

環境変数は.bashrcとかでよく設定するアレ。最も有名な環境変数は$PATHであろう。 環境変数には親プロセスから子プロセスへと伝播するという性質があり,これを利用してデータや設定の共有に使われる。

シェル変数

環境変数と比較するとあまり聞き覚えのない言葉だが,シェルスクリプトで書かれる,データ置き場としての普通の変数のことである。

シェル変数は環境変数と異なり,子プロセスへと伝播しない。

シェル変数はexportコマンドを使うことにより環境変数へと昇格する。

#!/bin/sh

# これがシェル変数
FOO=BAR

# シェルスクリプトの中では,環境変数同様に使える
echo $FOO

# exportによりシェル変数を環境変数にすることができる
export FOO

実験

さてコマンドの先頭につける変数はどちらの変数なのか。実験してみよう。

以下のようなシェルスクリプトを用意した。

#!/bin/bash
# envvar.sh

./envvar-child.sh
#!/bin/bash
# envvar-child.sh

echo variable is $VARIABLE

そしてenvvar.shを先頭に変数VARIABLEを付けてシェルから呼び出す。VARIABLEが環境変数であるなら変数が伝播するはずなので,envvar-child.shで表示できるはずだ。

$ VARIABLE=foo ./envvar.sh
variable is foo

親プロセスから子プロセスへと伝播した。したがって環境変数を指定していることになる。

まとめ

コマンドの先頭に付ける変数は,環境変数になることがわかった。 ところでこういう情報を探してbashのマニュアルなどを探すのだが,結局情報がつかめずに実験することになってしまった。