環境変数とシェル変数の入口
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
と入力します。
なお、これらの設定は現在のログインセッションでのみ維持されます。
設定を永続的に維持したい場合、後述のシェルのスタートアップファイルを編集します。
スタートアップファイルとは
シェルの設定情報は、複数のスタートアップファイル(設定ファイルのこと)に保存されています。
シェルが起動した際に、これらのスタートアップファイルの設定内容が読み込まれます。
では、どのようにこれらのスタートアップファイルが実行されるのでしょうか。
ユーザーがログインする際に、以下の順序で処理を開始します。
- /etc/profile
- /etc/profile.d/*.sh
これらのファイルには、システム全体の環境変数とシェル変数が保存されています。
システム全体とは、つまり全ユーザーに対して適用される設定ということです。
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
.bash_profile ファイルには、特定のユーザーの環境変数とシェル変数が保存されています。
.bashrc ファイルは、bashrc ファイルを実行します。また、特定ユーザーのエイリアスや関数が保存されています。
/etc/bashrc ファイルには、システム全体のエイリアスや関数が保存されています。
これらの実行が終わってようやくユーザーがログインでき、シェルが起動されます。
Discussion