「PATHを通す」「環境変数を設定する」——Linuxを使っていると頻繁に目にするこれらのフレーズ。しかし、環境変数の仕組みを正しく理解している方は意外と多くありません。
「.bashrcと.profileのどちらに書くべきか」「exportの意味がわからない」「設定したはずの環境変数が反映されない」——こうした疑問は、環境変数の基本的な仕組みを理解すれば解消できます。
本記事では、Linuxの環境変数について概念の理解から実践的な設定方法まで、体系的に解説します。シェルスクリプトや開発環境の構築にも直結する重要な知識ですので、ぜひ最後までお読みください。Linuxの基礎についてはLinuxとは?を、基本コマンドはLinuxコマンド一覧・実践ガイドをあわせてご覧ください。
環境変数とは何か
環境変数とは、OSやアプリケーションの動作を制御するための「名前と値の組み合わせ」です。Linuxのシェル上で動作するすべてのプログラムは、環境変数を参照して自身の振る舞いを決定します。
環境変数とシェル変数の違い
Linuxのシェルには2種類の変数があります。この違いを正しく理解することが重要です。
- シェル変数: 現在のシェルプロセスだけで有効。子プロセスには引き継がれない
- 環境変数: 現在のシェルおよびそこから起動されたすべての子プロセスに引き継がれる
# シェル変数の定義(子プロセスには引き継がれない)
MY_VAR="hello"
# 環境変数の定義(子プロセスに引き継がれる)
export MY_VAR="hello"
# シェル変数を環境変数に昇格
MY_VAR="hello"
export MY_VAR
# 確認: シェル変数はbashの子プロセスから見えない
MY_VAR="test"
bash -c 'echo $MY_VAR' # 何も表示されない
# 環境変数はbashの子プロセスから参照できる
export MY_VAR="test"
bash -c 'echo $MY_VAR' # "test" と表示される
exportコマンドが「環境変数にする」ための鍵です。exportなしで定義した変数はシェル変数であり、他のプログラムやスクリプトからは参照できません。
主要な環境変数一覧
Linuxで頻繁に使用される代表的な環境変数を紹介します。
# 主要な環境変数の確認
echo $PATH # コマンド検索パス
echo $HOME # ホームディレクトリ
echo $USER # 現在のユーザー名
echo $SHELL # 使用中のシェル
echo $LANG # ロケール(言語設定)
echo $EDITOR # デフォルトエディタ
echo $TERM # ターミナルの種類
echo $PWD # 現在のディレクトリ
echo $HOSTNAME # ホスト名
echo $DISPLAY # X11ディスプレイ(GUI環境)
環境変数の確認方法
現在設定されている環境変数を確認する方法はいくつかあります。
環境変数の一覧表示
# すべての環境変数を表示
env
# すべての環境変数を表示(別コマンド)
printenv
# 環境変数とシェル変数の両方を表示
set
# 特定の環境変数の値を確認
printenv PATH
echo $PATH
# 環境変数の検索(grepとの組み合わせ)
env | grep -i proxy
env | grep -i java
変数の存在確認
# 変数が定義されているか確認
if [ -z "$MY_VAR" ]; then
echo "MY_VARは未定義または空です"
else
echo "MY_VAR=$MY_VAR"
fi
# 変数が環境変数として存在するか確認
printenv MY_VAR && echo "環境変数として存在" || echo "環境変数として存在しない"
環境変数の設定方法
環境変数の設定は、一時的な設定と永続的な設定の2つに大きく分かれます。
一時的な設定(現在のセッションのみ)
# 環境変数を設定
export MY_APP_ENV="production"
export MY_APP_PORT=8080
# コマンド実行時のみ環境変数を設定
MY_APP_ENV="test" ./my_application
# 複数の環境変数を同時に設定してコマンドを実行
env MY_APP_ENV="test" MY_APP_DEBUG=true ./my_application
# 環境変数の削除
unset MY_APP_ENV
永続的な設定(設定ファイルに記述)
環境変数を永続的に設定するには、シェルの設定ファイルに記述します。ここで重要なのが、どのファイルに書くかです。
.bashrc・.bash_profile・.profileの違いと使い分け
環境変数の設定先として複数のファイルが存在することは、多くの人が混乱するポイントです。それぞれのファイルの役割と読み込みタイミングを正確に理解しましょう。
ログインシェルと非ログインシェルの違い
設定ファイルの使い分けを理解するには、まずログインシェルと非ログインシェルの違いを知る必要があります。
- ログインシェル: SSHでの接続、コンソールからのログイン、su -(ハイフンあり)で起動されるシェル
- 非ログインシェル: ターミナルエミュレータの起動、bash コマンドの実行、su(ハイフンなし)、シェルスクリプト内で起動されるシェル
各設定ファイルの読み込みタイミング
# ログインシェルが読み込むファイル(順番に検索、最初に見つかったものを実行)
1. /etc/profile # システム全体の設定
2. ~/.bash_profile # ユーザー個別の設定(最優先)
3. ~/.bash_login # .bash_profileがない場合
4. ~/.profile # 上記2つがない場合
# 非ログインシェルが読み込むファイル
1. /etc/bash.bashrc # システム全体の設定(ディストリビューションによる)
2. ~/.bashrc # ユーザー個別の設定
# ログアウト時に読み込むファイル
~/.bash_logout
推奨される設定方法
一般的なベストプラクティスは以下の通りです。
~/.bashrc に書くべきもの
- エイリアス(alias)の定義
- シェルのプロンプト設定(PS1)
- シェル関数の定義
- シェルオプションの設定
~/.bash_profile(または ~/.profile)に書くべきもの
- 環境変数の設定(PATH、EDITOR等)
- ログイン時に一度だけ実行すればよい処理
# ~/.bash_profile の推奨構成
# 環境変数の設定
export EDITOR="vim"
export LANG="ja_JP.UTF-8"
export PATH="$HOME/.local/bin:$PATH"
# .bashrcの読み込み(重要!)
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
# ~/.bashrc の推奨構成
# 非対話シェルの場合はここで終了
case $- in
*i*) ;;
*) return;;
esac
# エイリアスの設定
alias ll='ls -alF'
alias la='ls -A'
alias grep='grep --color=auto'
# プロンプトの設定
PS1='\u@\h:\w\$ '
# ヒストリー設定
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoreboth
.bash_profileから.bashrcをsource(読み込み)するのがポイントです。これにより、ログインシェルでも.bashrcの内容が反映されます。シェルスクリプトの基本はLinuxシェルスクリプト入門で解説しています。
システム全体の環境変数設定
全ユーザーに適用する環境変数は、以下のファイルに設定します。
# 方法1: /etc/environment(シェルに依存しない設定)
# キーと値のペアを記述
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
JAVA_HOME="/usr/lib/jvm/java-17"
# 方法2: /etc/profile.d/ にスクリプトを配置
# /etc/profile.d/myapp.sh
export MY_APP_HOME="/opt/myapp"
export PATH="$MY_APP_HOME/bin:$PATH"
ユーザーとグループの管理についてはLinuxユーザー・グループ管理を参照してください。
PATH環境変数の管理
PATHは、Linuxで最も重要な環境変数の一つです。シェルがコマンドを入力された際に、そのコマンドの実行ファイルを検索するディレクトリの一覧を定義します。
PATHの仕組み
# PATHの内容を確認
echo $PATH
# 出力例: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# PATHをわかりやすく表示
echo $PATH | tr ':' '\n'
# 出力例:
# /usr/local/sbin
# /usr/local/bin
# /usr/sbin
# /usr/bin
# /sbin
# /bin
コマンドを入力すると、シェルはPATHに登録されたディレクトリを左から順に検索し、最初に見つかった実行ファイルを起動します。
# コマンドがどのパスにあるか確認
which python3
# 出力例: /usr/bin/python3
# 同名のコマンドがすべて表示される
which -a python3
# コマンドの種類を確認(ビルトイン、エイリアス、パスなど)
type python3
type ls
type cd # builtinと表示される
PATHの追加方法
# PATHの末尾に追加(既存のPATHの後に検索される)
export PATH="$PATH:/opt/myapp/bin"
# PATHの先頭に追加(既存のPATHより先に検索される)
export PATH="/opt/myapp/bin:$PATH"
# ホームディレクトリのbinを追加(開発者でよくある設定)
export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
先頭と末尾のどちらに追加するかは重要です。先頭に追加した場合、同名のコマンドがあれば先に追加したパスのものが優先されます。
PATHの永続化
# ~/.bash_profile に追加して永続化
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile
# 設定を即座に反映
source ~/.bash_profile
PATHのトラブルシューティング
# 「コマンドが見つからない」エラーの調査
# 1. コマンドの場所を確認
which コマンド名
find / -name "コマンド名" -type f 2>/dev/null
# 2. PATHにそのディレクトリが含まれているか確認
echo $PATH | tr ':' '\n' | grep "対象ディレクトリ"
# 3. 実行権限があるか確認
ls -la /path/to/command
# PATHの重複を整理するワンライナー
export PATH=$(echo $PATH | tr ':' '\n' | awk '!seen[$0]++' | tr '\n' ':' | sed 's/:$//')
ファイルの実行権限についてはLinuxファイルパーミッションガイドで詳しく解説しています。
実務での環境変数活用パターン
ここでは、実際の開発・運用現場でよく使われる環境変数の設定パターンを紹介します。
開発環境の設定
# Java開発環境
export JAVA_HOME="/usr/lib/jvm/java-17"
export PATH="$JAVA_HOME/bin:$PATH"
# Node.js(nvm使用時)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
# Python仮想環境
export WORKON_HOME="$HOME/.virtualenvs"
export VIRTUALENVWRAPPER_PYTHON="/usr/bin/python3"
# Go言語
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
# Rust
export PATH="$HOME/.cargo/bin:$PATH"
AI開発環境でのPATH設定についてはLinux AI開発環境ガイドも参照してください。
アプリケーションの設定管理
近年の開発では、設定値を環境変数で管理する手法(12 Factor App)が標準的になっています。
# データベース接続情報
export DATABASE_URL="postgresql://user:pass@localhost:5432/mydb"
export REDIS_URL="redis://localhost:6379"
# アプリケーション設定
export APP_ENV="production"
export APP_PORT=3000
export APP_SECRET_KEY="your-secret-key"
export APP_LOG_LEVEL="info"
# 外部サービスのAPIキー
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_DEFAULT_REGION="ap-northeast-1"
.envファイルの活用
本番環境では.envファイルに環境変数をまとめ、アプリケーション起動時に読み込む方法が広く使われています。
# .envファイルの例
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
APP_ENV=production
APP_PORT=3000
APP_LOG_LEVEL=info
# .envファイルを読み込む(シェルから)
set -a
source .env
set +a
# または、export付きで読み込む
export $(grep -v '^#' .env | xargs)
注意: .envファイルには機密情報が含まれるため、gitリポジトリにコミットしないよう .gitignoreに必ず追加してください。ファイルパーミッションも適切に設定しましょう。
systemdサービスでの環境変数設定
systemdで管理するサービスに環境変数を渡す方法です。
# サービスファイルでの直接設定
# /etc/systemd/system/myapp.service
[Service]
Environment="APP_ENV=production"
Environment="APP_PORT=3000"
ExecStart=/usr/local/bin/myapp
# 環境変数ファイルから読み込み
[Service]
EnvironmentFile=/etc/myapp/env
ExecStart=/usr/local/bin/myapp
systemdの詳しい設定方法はLinux systemd・サービス管理ガイドで解説しています。
環境変数のトラブルシューティング
環境変数に関するよくある問題と対処法をまとめます。
設定した環境変数が反映されない
# 原因1: exportしていない
MY_VAR="value" # ← シェル変数(子プロセスに渡らない)
export MY_VAR="value" # ← 環境変数(子プロセスに渡る)
# 原因2: 設定ファイルを再読み込みしていない
source ~/.bashrc # 設定ファイルを再読み込み
# または
. ~/.bashrc
# 原因3: 書く場所を間違えている
# ログインシェルなのに.bashrcにだけ書いた → .bash_profileにsource ~/.bashrcを追加
# 原因4: 別のファイルで上書きされている
# 読み込み順を確認してデバッグ
bash -x -l -c 'echo $MY_VAR' 2>&1 | grep MY_VAR
sudoで環境変数が引き継がれない
# sudoはセキュリティ上、環境変数をリセットする
echo $MY_VAR # 値が表示される
sudo bash -c 'echo $MY_VAR' # 空(環境変数がリセットされる)
# 解決方法1: -Eオプションで環境変数を保持
sudo -E bash -c 'echo $MY_VAR'
# 解決方法2: sudo実行時に明示的に環境変数を渡す
sudo MY_VAR="value" コマンド
# 解決方法3: /etc/sudoersで保持する環境変数を指定
# visudoで編集(直接編集は危険)
# Defaults env_keep += "MY_VAR"
cronジョブで環境変数が使えない
cronは最小限の環境変数しか設定されない状態でジョブを実行します。
# 解決方法1: cronジョブ内で環境変数を明示的に設定
# crontab -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
JAVA_HOME=/usr/lib/jvm/java-17
0 3 * * * /path/to/script.sh
# 解決方法2: スクリプト内で.bashrcを読み込む
#!/bin/bash
source $HOME/.bashrc
/path/to/command
# 解決方法3: envコマンドで環境を確認
* * * * * env > /tmp/cron-env.txt # cronの環境変数を出力(デバッグ用)
cronの詳しい使い方はLinux cron・スケジュール実行ガイドで解説しています。
まとめ
Linuxの環境変数は、システム管理と開発の両面で不可欠な知識です。本記事で解説した内容を振り返りましょう。
- 環境変数はexportで定義され、子プロセスに引き継がれる。シェル変数は現在のシェルのみで有効
- .bash_profileにはログイン時に一度だけ実行する環境変数の設定を、.bashrcにはエイリアスや関数を記述する
- PATHはコマンド検索パスを定義する最重要環境変数。追加する順序(先頭/末尾)に注意する
- 開発環境では.envファイルやsystemdのEnvironmentFileで環境変数を管理する
- sudo、cron、SSHなど環境変数が引き継がれないケースを理解しておくことが重要
環境変数の知識は、シェルスクリプトの作成、Docker環境の構築、Webサーバーの設定など、あらゆるLinux運用の場面で求められます。Linuxの基本を体系的に学びたい方はLinuxコマンド一覧・実践ガイドもぜひご活用ください。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践