LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルサーバーやコンテナ環境を操作している中で、「スクリプトからデータベースの接続先が見つからない」「パスを通したはずなのにコマンドが実行できない」といったトラブルに直面したことはないでしょうか。これらのトラブルの一因として、環境変数の設定不備やスコープ(適用範囲)の理解不足が挙げられます。
この記事では、Linuxの環境変数に関する基本的な仕組みから、現在の値を確認する方法、一時的な設定方法、そして再起動後も値を保持するための永続化の方法まで、実務で必要な手順を網羅して解説します。
この記事を読むことで、環境変数の役割を正確に理解し、目的に応じてユーザー別やシステム全体に適切な設定を行えるようになります。
確認した環境
本記事の解説およびコマンドは、以下の環境で動作を確認しています。
Linuxの環境変数とは?仕組みと役割を基礎から解説
環境変数とは、Linuxオペレーティングシステム(OS)上で実行されるプロセスに対して、動作に必要な設定情報や外部パラメータを渡すための仕組みです。例えば、ユーザーのホームディレクトリを示す HOME や、実行ファイルを探すパスを格納する PATH などが代表的な環境変数です。
環境変数はプロセスの環境に含まれ、親プロセスから子プロセスへ継承されます。これにより、各アプリケーションはシステム固有のパスやユーザー設定を動的に把握し、柔軟に動作することが可能になります。なお、環境変数はOS全体で自動的に共有されるものではなく、あくまでプロセスの親子関係を通じて引き継がれる仕組みです。
環境変数とシェル変数の違い
Linuxで変数を扱う際によく混同されるのが「環境変数」と「シェル変数」です。
- 環境変数:
exportコマンドで環境にエクスポートされた変数です。現在のシェルプロセスだけでなく、そこから起動される子プロセスや外部コマンドからも参照できます。 - シェル変数:
exportされていない変数で、定義した現在のシェル(プロセス)内でのみ有効です。子プロセスの環境には引き継がれません。
シェル変数は一時的な作業やスクリプト内のローカルな値の保持に向いており、他のプログラムやコマンドに引き渡す必要がある設定値には環境変数を使用します。
現在設定されている環境変数を確認する方法
現在システムやシェルにどのような環境変数が設定されているかを確認するには、主に printenv コマンドや echo コマンドを使用します。
printenvコマンドの使い方
すべての環境変数と現在割り当てられている値の一覧を表示するには、オプションなしで printenv コマンドを実行します。
printenv実行すると、以下のようにキーと値のペアが大量に出力されます。
USER=ubuntuHOME=/home/ubuntuLANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin特定の環境変数だけを確認したい場合は、引数に変数名を指定します。
printenv USER出力例:
ubuntuecho $変数名で特定の値を見る
シェル変数の値も含めて確認したい場合や、手軽に特定の環境変数の値だけを出力したい場合は、echo コマンドとドル記号($)を組み合わせます。
echo $PATH出力例:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binもし指定した環境変数が存在しない場合、echo $変数名 は何も出力せず改行のみを返します。
一時的に環境変数を設定する方法
シェルセッションの実行中のみ、あるいは特定のコマンドの実行時のみに環境変数を適用したい場合は、一時的な設定方法を用います。
exportコマンドを使った設定手順
現在のシェルセッションに対して一時的に環境変数を設定するには、export コマンドを使用します。
export APP_ENV=development設定後、正しく反映されているかを printenv で確認します。
printenv APP_ENV出力例:
developmentこの方法で設定した環境変数は、設定を行ったシェルと、そのシェルから起動される子プロセスで有効です。シェルを終了すると、その設定は失われます。
設定した環境変数が消えるタイミング
export コマンドで設定した環境変数は、以下のタイミングで消去(無効化)されます。
- 設定を行ったシェルプロセスを終了したとき(ターミナルウィンドウを閉じる、SSHSSH [エスエスエイチ]Secure Shell。暗号化されたリモート接続プロトコル接続を切断する、
exitコマンドを実行するなど) - OSを再起動したとき
一時的な設定は、アプリケーションの動作テストや、特定のスクリプトを一時的なパラメータで実行したい場合に適しています。
環境変数を永続化(恒久的)に設定する方法
サーバーの再起動後や、新しく開いたシェルでも環境変数を設定できるようにするには、適切な設定ファイルに記述します。永続化には「ユーザー個別」に適用する方法と「システム全体」に適用する方法があります。
ユーザー個別で永続化する場合(.bashrcや.bash_profile)
特定のユーザーだけで環境変数を恒久的に利用したい場合は、ホームディレクトリ配下にある設定ファイルに追記します。Bashを使用している場合、主に以下のファイルが使用されます。
~/.bashrc: インタラクティブ非ログインシェル(GUIGUI [ジーユーアイ / グーイ]Graphical User Interface。グラフィカルな操作画面で新規ターミナルを開いた際など)で、新しいシェルを開くたびに読み込まれます。~/.bash_profileまたは~/.profile: ログインシェル(SSHログイン時など)で、ログイン時に一度だけ読み込まれます。
Ubuntuの標準的なユーザー環境では、~/.profile から ~/.bashrc を読み込む構成になっています。これは、ログイン時にも非ログインシェルと共通の設定を適用するためです。そのため、SSHログイン後のBashでも ~/.bashrc に設定した環境変数が利用できるケースが一般的です。ただし、ユーザーの設定やログイン方法によって読み込まれるファイルは異なります。
手順1: エディタで設定ファイルを開く
nano ~/.bashrc手順2: ファイルの末尾にexport文を追加する
export DATABASE_HOST=localhostexport DATABASE_PORT=5432手順3: ファイルを保存して閉じる
nanoエディタの場合は Ctrl + O で保存し、Enter を押し、Ctrl + X で終了します。
手順4: 設定を即座に反映させる
ファイルを編集しただけでは現在のシェルセッションに反映されないため、source コマンドで再読み込みを行います。
source ~/.bashrcシステム全体で永続化する場合(/etc/profileや/etc/environment)
OSを利用するすべてのユーザーに対して共通で環境変数を適用したい場合は、システム全体の設定ファイルを編集します。これには sudo 権限が必要です。
/etc/profile: Bashなどのログインシェルで読み込まれる、システム全体のシェル設定ファイルです。/etc/environment: PAM(Pluggable Authentication Modules)のpam_envモジュールによってログイン時に読み込まれる環境変数定義ファイルです。シェルスクリプトではないため、キーと値のペアをシンプルに記述します。
システム全体のログイン環境に環境変数を設定する場合は、/etc/environment を利用できます。ただし、PAMによるログイン環境などで利用される仕組みであり、systemdサービスなどすべてのプロセスに自動的に適用されるわけではありません。
手順1: /etcetc [エトセトラ / イーティーシー]et ceteraの略。「〜など」を意味する/environmentを編集する
sudo nano /etc/environment手順2: 変数名と値を代入形式で追加する
APP_MODE="production"API_TIMEOUT="30"※ /etc/environment 内では export コマンドは使用せず、KEY=value の形式で記述します。また、シェルスクリプトではないため、PATH=$PATH:/opt/bin のように既存の変数を参照する記述はできません。$PATH が展開されず文字列としてそのまま設定され、コマンドが実行できなくなる原因になります。
手順3: 設定を反映させる
/etc/environment はシェルスクリプトではなく、PAMによってログイン時に読み込まれるファイルです。そのため、変更を反映するにはいったんログアウトして再ログインします。
現在のシェルセッションで即座に適用したい場合は、手動で export コマンドを実行してください。
export APP_MODE="production"export API_TIMEOUT="30"環境変数を設定・反映した後の注意点
環境変数を設定した後は、以下の点に注意して正しく動作するか確認してください。
- 構文のミスに注意する
変数名と値の間にあるイコール(=)の前後にはスペースを入れないでください。KEY = valueとするとエラーになります。 - プロセスの継承スコープを確認する
バックグラウンドで動くサービス(systemdなど)は、ユーザーがログインしているシェルとは異なる環境で起動されるため、~/.bashrcや/etc/environmentに設定した環境変数がそのまま利用できないことがあります。サービス用の環境変数は、UnitファイルのEnvironment=やEnvironmentFile=を利用して明示的に設定できます。 - パスの重複や上書きに注意する
PATH変数に新しいディレクトリを追加する際は、既存のパスを消してしまわないよう$PATHを含めて定義します。末尾に追加する場合はexport PATH=$PATH:/opt/bin、新しいパスを優先させたい場合はexport PATH=/opt/bin:$PATHのように先頭に追加します。 - コンテナ環境の環境変数は別管理
DockerDocker [ドッカー]コンテナ型仮想化プラットフォームなどのコンテナ環境では、ホスト側でexportした環境変数がコンテナ内に自動的に引き継がれるわけではありません。コンテナの環境変数は、docker run -eオプションやDocker Composeのenvironment設定など、コンテナ起動時に別途指定します。
まとめ
本記事では、Linuxの環境変数に関する基礎知識から確認・設定・永続化までの手順を解説しました。
- 環境変数とシェル変数の違い: 子プロセスに引き継がれるのが環境変数、現在のシェル内のみがシェル変数。
- 確認方法:
printenvまたはecho $変数名を利用して現在の値を確認する。 - 一時的な設定:
exportコマンドを使用するが、セッション終了や再起動で値は消える。 - 永続化の方法: ユーザー別なら
~/.bashrc、システム全体のログイン環境なら/etc/environmentに記述して設定を保持する。
適切な環境変数の管理を行うことで、アプリケーションの動作安定性と保守性を高めることができます。ぜひ日々の運用や開発にお役立てください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。