【LPIC】シェル変数と環境変数の違い【setコマンドとenvコマンド】
シェル変数と環境変数の違い
シェル変数は設定されたシェルだけが使用する変数。
一方で環境変数は設定されたシェルとシェルで起動したプログラム(プロセス)が使用する変数。
環境変数とシェル変数の違いの事例
例えば、シェルからlsコマンドを実行して、lsのプロセスを起動する。
この時、lsのプロセスには環境変数は引き継がれるが、シェル変数は引き継がれない。
実際にシェル変数と環境変数を作ってみる
まずはシェル変数を作ってみる
まずはシェル変数を作ってみる。
MESSAGE=test
これで、シェルの中にMESSAGEというシェル変数が作られた。値はtest
になる。
続けて、下記コマンドを打つ。
echo $MESSAGE
すると、ターミナル(シェル)にtestと表示された。
以下のシェルスクリプトを作成してみる。ファイル名は任意で良い。実行権限を付与して実行する。
#! /bin/bash
echo ${MESSAGE}
シェルから起動された子プロセスは、シェル変数を読み取ることはできない。
【補足1】変数の波括弧がある場合と波括弧がない場合はどう違うのか?
波括弧の有無はどこまでが変数名であるかを明確にしている。つまり、以下は等価である
echo $MESSAGE
echo ${MESSAGE}
こちらも、等価である。
echo $MESSAGE test
echo ${MESSAGE} test
いずれも${MESSAGE}
との間にスペースができる。スペースを作らないようにするには、こうする。
echo ${MESSAGE}test
波括弧が無いと、このようにスペース無しで文字列を連結させることができない。
# これだと別の変数扱いになってしまう。
echo $MESSAGEtest
続いて、環境変数を作ってみる
export
コマンドを使用することで、環境変数を作ることができる。
MESSAGE=test
export MESSAGE
ちなみに、こちらでもよい。
export MESSAGE=test
これで環境変数のMESSAGEが作られた。
この状態で、先程のシェルスクリプトを動かしてみる。このように子プロセスは環境変数を読み取ることができた。
このように環境変数は子プロセスから読み取りできるが、シェル変数は読み取りできない。
シェル変数と環境変数の一覧を表示するコマンドは?
シェル変数
set
でシェル変数一覧が表示される。
主なシェル変数として、以下のようなものが有る。
変数名 | 表示される値 |
---|---|
PWD | カレントディレクトリの絶対パス |
PATH | コマンド検索パス |
HOME | ユーザーのホームディレクトリ |
HOSTNAME | ホスト名 |
USER | ユーザー名 |
HISTSIZE | コマンド履歴の最大値 |
HISTFILE | コマンド履歴を格納するファイル |
LANG | ロケール(言語と文字コード) |
TERM | 端末の種類 |
ただ、一部は環境変数としても扱うことができるようになっている。例えば、PWDは環境変数でもある。
先程のシェルスクリプトに、${PWD}
を追加してみよう。
#! /bin/bash
echo ${MESSAGE}
echo ${PWD}
正常に表示されている。ということは、PWDは環境変数でもあるということがわかる。
ちなみに、シェル変数の中から、検索をするには、以下のコマンドを実行する。例えば、PWDコマンドの検索であれば
set | grep "PWD"
こうする。これでシェル変数の中にPWDがあることがわかる。
環境変数
環境変数の一覧を表示するには、
env
と打てばよい。
こちらも、検索時にはgrepコマンドを使用する。
env | grep "PWD"