こういうコマンド呼び出しをすることがあると思う。
$ FOO=BAR ./command.sh
ところでこのFOO
は環境変数なのだろうか,それともただのシェル変数なのだろうか?
bashでFOO=BAR ./command.shみたいにコマンドの先頭に変数を指定することあると思うんだけど,この場合FOOは環境変数扱いになるんだろうか,それともただのシェル変数になる?(子プロセスに伝播するか気になっている)
— WINDYMELT🌈💰🎨 (@windymelt) July 29, 2019
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のマニュアルなどを探すのだが,結局情報がつかめずに実験することになってしまった。