目次
本記事を見て得られること
本記事で得られることは下記となります。
・環境変数とシェル変数の違い
・環境変数確認に関連するコマンドの紹介
・個人的な体験談・利用例の紹介
使用する環境
Centosにおける今後の後継として注目されるAlmaLinuxを使用します。
・AlmaLinux-8.4
シェル変数と環境変数について
シェル変数とは
シェル変数とは起動しているシェル内でのみ使用される変数です。
適応範囲として設定した値が同一シェル内でしか参照できないのに対し、環境変数に設定した値はシェルをまたいで参照できます。
シェル変数を表示するにはsetコマンドを利用します。grepコマンドを合わせて使うことにより早く検索することができます。
環境変数とは
環境変数とは、OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたものです。
プログラムの実行時などに必要となります。
変数を環境変数にするにはexportコマンドを利用します。この場合、exportコマンドを実行したシェル、及びそのサブプロセスに対して、その環境変数が有効になります。
通常は後述する設定ファイルに記載します。
環境変数確認で主に使用するコマンド
echo
引数にある文字列を出力します。
変数の前に「$」をつけることにより変数の中身を表示することができます。
書式
echo [オプション] 引数
echo "TEST=$LANG"で引数変数を記載してダブルクォーテーションで囲むことにより変数を展開(変数の中身を表示)させることもできます。
単に引数に変数を記載した場合変数の中身を展開することができます。
オプション:-n
標準出力を改行出力しないようにします。
オプションをつけていない場合だと改行されて出力されておりますが、「-n」を付けている場合は改行されずに出力されます。
printenv
環境変数を表示するコマンドです。
引数無しで実行すると設定されているすべての環境変数が「変数名=設定されている値」という形式で表示されます。
echoコマンドと違い環境変数の中身を表示する際は「変数名」を引数にします。
書式
printenv [オプション][変数名]
「printenv LANG」と実行することによりLANG変数の中身を表示します。
printenvだけだと環境変数の一覧を表示します。
env
環境変数を表示します。
printenvとの違いは環境変数を一時的に設定してコマンドを実行することができます。
「env 環境変数名=値 コマンド」で、環境変数に特定の値を指定しつつ、コマンドを実行します。
書式
env [オプション]
printenv同様に環境変数を表示します。
オプション:-i
すでに設定されているすべての環境変数を無効にします。
このように環境変数を表示しても無効にされているので、grepコマンドで検索してみても表示されません。
set
シェル変数と環境変数、シェル関数を表示します。
書式
set [オプション]
出力結果が長いため省略しますが、下記例では関数が表示されています。
オプション:-a
シェル変数定義と同時に環境変数として設定します。
最初はENMAEシェル変数として定義し、printenvコマンドで表示しようとしますが、シェル変数であるため表示されず。「set -a」コマンド実行後、再度同様のコマンドを実行すると表示されました。
ENAMEが環境変数として定義され、printenvコマンドで表示されました。
setコマンドはオプション豊富で多々ございますので、ご興味ある方は下記サイトがとても参考になるので是非ご参考ください。
unset
環境変数を削除します。
書式
unset [変数名]
下記実行例では設定した環境変数「ENAME」を削除しています。削除後存在しないことが確認できます。
export
変数を環境変数に設定します。
書式
export [オプション] 変数
ENAME変数を環境変数としてexportコマンド設定します。その後、printenvコマンドでENAMEが環境変数として設定されていることを確認します。
オプション:-n
指定した環境変数をシェル変数に変更します。
オプション:-p
エクスポートされた変数と関数を一覧表示します。
source
指定したファイルのスクリプトを実行します。
sourceコマンドの引数として読み込みたい設定ファイル名を指定します。
利用する理由としてシェルスクリプトを起動すると子プロセスとして実行され、実行後は親プロセスにシェル変数・環境変数は引き継がれません。
そこで、シェルスクリプトで変数を反映させるにはsourceコマンドを使用します。
現在のシェルでスクリプトが実行されますので、現在のシェルに実行したスクリプトのシェル変数・環境変数が反映されます。
ただし読み込んだ設定ファイルが反映されるのは、sourceコマンドを実行したシェルだけであって、起動中のシェルすべてのシェルに設定が反映されるわけではありません。
書式
source ファイル [ファイル実行時の引数]
使い方として「source ファイル名」という形式で使用します。
使用例・体験談
これまで紹介した環境編の内容やコマンドについて一般的な使い方を紹介します。
環境変数設定・定義
環境変数を定義するにはexportコマンドを利用します。
環境変数に設定する値で値の中に変数を入れると便利に使えます。
ENAME = "My name is: $ENAME"
※変数にダブルクオーテーションを付けることによりコマンド実行時には、変数の値が使用されます。
環境変数削除
環境変数を削除するにはunsetコマンドを利用します。
環境変数一覧・値を表示する
一覧表示
printenv、envコマンドを実行します。
変数の値表示
「printenv 変数」または「echo $」変数で表示できます。
シェル変数・環境変数の即時反映
設定ファイルに定義したい変数を記載し。sourceコマンドでシェルに反映します。
今回は「.bash_profile」に「export ENAME=mitsu」という環境変数を定義しています。
その後sourceコマンドの実行前では環境変数ENAMEが存在しないことを確認し、
sourceコマンド実行後、環境変数ENAME変数が存在することが確認できます。
設定ファイル起動順序
ログインした時に実行されるファイルの順序
これまでコマンドにより環境変数などの設定方法を紹介してきました。
ですが都度設定するのは手間なので、ログインした際に自動的に設定できるようにするのが下記ファイルたちです。
それぞれ役割があるので、紹介していきます。まずはログインした際の実行される順序を紹介していきます。
1 /etc/profile
2 /etc/profile/profile.d/の中のsh
3 ~/.bash_profile → ~/.bash_login → ~/.profile
※~/.bash_profileが存在しなければ→のファイルを検索
4 ~/.bashrc
5 /etc/bashrc
6 bash実行
これらのファイルはログインした際に実行されるファイルたちですが、特定のファイルに記述することで、ユーザごとに環境変数を設定、全体に対して設定したりすることができます。
そのため都度設定する必要はなく、今後も作成する変数を使っていきたいなら、設定ファイルを利用したほうが早く便利なのでぜひ覚えていってください。
環境変数・シェル変数設定ファイルについて
それではファイルを紹介していきます。それぞれ役割があるので、目的に応じたファイルに変数の定義やexportコマンドによる環境変数の定義を行います。
/etc/profile
基本的に「/etc/profile」と「/etc/bashrc」は全ユーザー共通で利用する設定ファイルで書き換えるのは推奨されていません。
環境変数の定義は/etc/profileに記載します。
このファイルはログイン時に読み込む全てのユーザ共通の設定が書いています。
/etc/profile/profile.d/
アプリケーション毎に用意されたディレクトリです。
このディレクトリ以下にアプリケーション毎に必要なファイルを用意し、環境変数の定義を行います。
〜/.bash_profile→〜/.bash_login→~/.profile
「.bash_profile」,「~/.bash_login」,「~/.profile」はログイン時に1度だけ読み込まれます。
各ユーザーごとに異なる設定にする場合は各ユーザーのhomeディレクトリにある「.bash_profile」もしくは「.bashrc」を編集します。
.bashrc
「.bashrc」はbashを起動するたびに読み込まれます。
各ユーザーごとに異なる設定にする場合は各ユーザーのhomeディレクトリにある「.bash_profile」もしくは「.bashrc」を編集します。
このファイルはbashが読み込まれる度に更新されます。「bash」とコマンドを打てば設定ファイルへの変更が反映されます。
エイリアスの設定や、bashの動作に関わるシェル変数などはこのファイルで設定します。
下記例ではENAME変数を値「mitsu」に設定しています。
/etc/bashrc
bash起動時に読み込まれる環境設定ファイルです。こちらのファイルにはbash起動時に使われる環境変数を記載します。
まとめ
・環境変数関連のコマンドはprintenv,env,set,unset,export,sourceである
・環境変数を特定のファイルに記述することにより設定を自動化できる
以上となります。デフォルトで設定されいている環境変数LANGやPATHなどしらべて見ると面白いので、ぜひ調べて見てください。
当メディアではLinuxに関する事やできることなど紹介していくので、ご興味ある方ぜひご参考いただけますと幸いです。