🍭

環境変数とシェル変数の入口

2021/05/04に公開

Bash などのシェルには、2つの変数が備わっています。
それは、環境変数とシェル変数です。

- 環境変数とは
現在のシェルで定義され、子プロセスやシェルに継承される変数のこと

- シェル変数とは
定義されたシェルにのみ含まれる変数のこと

これらに、どのような役割や違いがあるかを知るために、コマンドラインを使いながら見ていきます。
(筆者環境: MacOS Big Sur ver11.2.3 Bash)

使用するコマンド

  • printenv
    すべて、または特定の環境変数とその値を表示します。
    例えば、printenv SHELL と入力すると、SHELL=/bin/zsh といった結果が帰ってきます。
    env コマンドも同様に環境変数を一覧できます。

  • set
    すべて、または特定のシェル変数とその値を表示します。

  • echo $変数名
    この方法でも、特定の変数の値を取得することができます。
    上記2つと違い、変数名の先頭に $ を入力しておく必要があります。

変数を設定する

新たに変数を設定したいときは、ターミナル上で以下のコマンドを入力します。

例:VAR=test

変数名=その値 で入力すると、そのシェル内に変数が設定されます。
本当に設定されたかどうかを確認してみましょう。

set | grep VAR と入力すると、結果に VAR=test が表示されました。
ちゃんと登録できたようです。

では、printenv | grep VAR ではどうでしょうか。
結果は何も返されません。
シェル変数として登録されましたが、環境変数としては登録されていないことがわかりました。

環境変数を設定する

さきほど登録した変数を環境変数として設定するには、export コマンドを使用します。

export VAR

その後、printenv | grep VAR を入力すると、VAR 変数が表示されました。
また、export VAR2=test とすることで、一発で環境変数として設定することもできます。

ちなみに、これらの変数はファイルなどに登録しているわけではないため、リブートなどすれば消去されてしまいます。

変数を消去する

さきほど設定した環境変数を消去します。export の -n オプションで消去可能です。

export -n VAR

printenv で結果を見てみると、対象の VAR 変数は消去されていることがわかりました。

シェル変数を消去するには、unset コマンドを使用します。

unset VAR

なお、unset コマンドを使うことで対象の変数はシェル変数および環境変数からも消去されます。

set コマンドのオプションを設定する

シェルには様々なオプションが付与されています。
どんなものがあるか見るために、set -o と入力すると、以下のようなリストが表示されます。

allexport      	off
braceexpand    	on
emacs          	on
errexit        	off
errtrace       	off
functrace      	off
hashall        	on
histexpand     	on
history        	on
ignoreeof      	off
interactive-comments	on
keyword        	off
monitor        	on
noclobber      	off
noexec         	off
noglob         	off
nolog          	off
notify         	off
nounset        	off
onecmd         	off
physical       	off
pipefail       	off
posix          	on
privileged     	off
verbose        	off
vi             	off
xtrace         	off

ここでは各オプションの詳細には触れませんが、これらのオプションは、シェル上で作業するうえでの利便性や効率性を高めてくれます。

これらのオプションには on/off とそれぞれ設定されていますが、設定を変更することもできます。
たとえば、vi オプションを ON にしたい場合、set -o vi と入力します。
逆にオプションを OFF にしたい場合、set +o vi と入力します。

なお、これらの設定は現在のログインセッションでのみ維持されます。
設定を永続的に維持したい場合、後述のシェルのスタートアップファイルを編集します。

スタートアップファイルとは

シェルの設定情報は、複数のスタートアップファイル(設定ファイルのこと)に保存されています。
シェルが起動した際に、これらのスタートアップファイルの設定内容が読み込まれます。

では、どのようにこれらのスタートアップファイルが実行されるのでしょうか。
ユーザーがログインする際に、以下の順序で処理を開始します。

  1. /etc/profile
  2. /etc/profile.d/*.sh

これらのファイルには、システム全体の環境変数とシェル変数が保存されています。
システム全体とは、つまり全ユーザーに対して適用される設定ということです。

  1. ~/.bash_profile
  2. ~/.bashrc
  3. /etc/bashrc

.bash_profile ファイルには、特定のユーザーの環境変数とシェル変数が保存されています。
.bashrc ファイルは、bashrc ファイルを実行します。また、特定ユーザーのエイリアスや関数が保存されています。
/etc/bashrc ファイルには、システム全体のエイリアスや関数が保存されています。

これらの実行が終わってようやくユーザーがログインでき、シェルが起動されます。

GitHubで編集を提案

Discussion