自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【LPIC】シェル変数と環境変数の違い【setコマンドとenvコマンド】

  • 作成日時:
  • 最終更新日時:
  • Categories: インフラ
  • Tags: LPIC Linux
thumbnail

シェル変数と環境変数の違い

シェル変数は設定されたシェルだけが使用する変数。

一方で環境変数は設定されたシェルとシェルで起動したプログラム(プロセス)が使用する変数。

環境変数とシェル変数の違いの事例

例えば、シェルから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"

参照元

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ