「PATHって何?どこで設定されてるの?」 「環境変数が反映されない…」 「システム全体とユーザー個別の違いは?」
環境変数はLinuxシステムの設定の要です。
でも、どこにどんな環境変数があって、 どうやって確認・設定するのか 体系的に理解している人は少ないんです。
この記事を読めば、 環境変数の確認から設定、トラブルシューティングまで 完全にマスターできます!
環境変数を確認する基本コマンド

printenv – 最もシンプルな確認方法
# すべての環境変数を表示
printenv
# 特定の環境変数を表示
printenv PATH
printenv HOME
printenv USER
# 複数の環境変数を同時に確認
printenv PATH HOME USER
# パイプで検索
printenv | grep -i python
# ソートして表示
printenv | sort
# 環境変数の数をカウント
printenv | wc -l
env – 環境変数の表示と実行
# すべての環境変数を表示
env
# 特定のパターンで検索
env | grep -i java
# 環境変数を設定してコマンド実行
env LANG=C date
env PATH=/custom/path:$PATH which python
# 環境変数をクリアして実行
env -i /bin/bash --norc
# 特定の環境変数だけを削除
env -u PATH echo $PATH
echo – 個別の環境変数確認
# $記号を付けて参照
echo $PATH
echo $HOME
echo $USER
# 中括弧で明確に区切る
echo ${PATH}
echo ${HOME}/${USER}
# デフォルト値付き表示
echo ${EDITOR:-vi} # EDITORが未設定ならviを表示
# 環境変数の存在確認
echo ${MYVAR:?この変数は設定されていません}
# 複数の環境変数を一度に
echo "User: $USER, Home: $HOME, Shell: $SHELL"
export – 環境変数の一覧と設定
# エクスポートされた環境変数の一覧
export
# より詳細な形式で表示
export -p
# 特定の変数を検索
export -p | grep -i proxy
# 関数もエクスポート可能
export -f # エクスポートされた関数一覧
詳細な環境変数の確認方法
declare/typeset で詳細確認
# すべての変数(環境変数+シェル変数)
declare
# 環境変数のみ
declare -x
# 整数型の変数
declare -i
# 読み取り専用変数
declare -r
# 配列変数
declare -a
# 特定の変数の属性を確認
declare -p PATH
declare -p BASH_VERSION
set – シェル変数を含むすべての変数
# シェル変数と環境変数をすべて表示
set
# 特定の変数を検索
set | grep -i home
# シェルオプションも表示
set -o
# 位置パラメータを設定
set -- arg1 arg2 arg3
echo $1 $2 $3
/proc から確認
# 特定プロセスの環境変数を確認
cat /proc/$$/environ | tr '\0' '\n'
# 他のプロセスの環境変数(要権限)
sudo cat /proc/1234/environ | tr '\0' '\n'
# 実行中のプロセスすべての環境変数を確認
ps auxe | grep process_name
# systemdサービスの環境変数
systemctl show service_name | grep -i environment
主要な環境変数の意味と確認
システム系環境変数
# ユーザー関連
echo $USER # 現在のユーザー名
echo $HOME # ホームディレクトリ
echo $UID # ユーザーID
echo $GROUPS # グループID
# シェル関連
echo $SHELL # デフォルトシェル
echo $BASH # Bashの実行パス
echo $BASH_VERSION # Bashのバージョン
echo $SHLVL # シェルのネストレベル
# システム情報
echo $HOSTNAME # ホスト名
echo $OSTYPE # OS種別
echo $MACHTYPE # マシンタイプ
echo $LANG # システムロケール
echo $TZ # タイムゾーン
PATH関連
# PATH(実行ファイルの検索パス)
echo $PATH | tr ':' '\n' # 見やすく表示
# ライブラリパス
echo $LD_LIBRARY_PATH
echo $LIBRARY_PATH
# Pythonパス
echo $PYTHONPATH
# Javaパス
echo $JAVA_HOME
echo $CLASSPATH
# manページのパス
echo $MANPATH
開発関連
# エディタ
echo $EDITOR
echo $VISUAL
# ブラウザ
echo $BROWSER
# プロキシ
echo $http_proxy
echo $https_proxy
echo $no_proxy
# デバッグ
echo $DEBUG
echo $VERBOSE
環境変数の検索と分析

特定の環境変数を探す
# 環境変数名で検索(大文字小文字無視)
printenv | grep -i proxy
# 値に特定の文字列を含む環境変数
printenv | grep -E "=/usr/local"
# PATHに含まれるディレクトリを確認
echo $PATH | tr ':' '\n' | while read dir; do
[ -d "$dir" ] && echo "✓ $dir" || echo "✗ $dir (not found)"
done
# 重複したPATHエントリを検出
echo $PATH | tr ':' '\n' | sort | uniq -d
環境変数の統計
#!/bin/bash
# 環境変数の統計情報
echo "=== 環境変数統計 ==="
echo "総数: $(printenv | wc -l)"
echo "PATH内のディレクトリ数: $(echo $PATH | tr ':' ' ' | wc -w)"
echo "最長の環境変数名: $(printenv | cut -d= -f1 | awk '{print length, $0}' | sort -rn | head -1)"
echo "最長の値を持つ変数: $(printenv | awk -F= '{print length($2), $1}' | sort -rn | head -1)"
環境変数の設定場所と読み込み順序
システム全体の設定ファイル
# システム全体(すべてのユーザー)
/etc/environment # 基本的な環境変数
/etc/profile # ログインシェル用
/etc/profile.d/*.sh # 追加設定スクリプト
/etc/bash.bashrc # Bash用(Debian/Ubuntu)
/etc/bashrc # Bash用(RedHat/CentOS)
# 確認コマンド
grep -r "export" /etc/profile.d/
cat /etc/environment
ユーザー個別の設定ファイル
# ユーザーホームディレクトリ
~/.profile # ログインシェル
~/.bash_profile # Bashログインシェル
~/.bashrc # 対話型Bashシェル
~/.bash_login # Bashログイン(代替)
~/.zshrc # Zsh用
~/.config/environment.d/ # systemd user環境
# 読み込み順序の確認
bash -x -l -c 'echo' 2>&1 | grep '^+.*source\|^\+.*\.'
読み込み順序の理解
# ログインシェルの場合
# 1. /etc/profile
# 2. /etc/profile.d/*.sh
# 3. ~/.bash_profile または ~/.bash_login または ~/.profile
# 4. ~/.bashrc (通常は.bash_profileから呼ばれる)
# 非ログインシェルの場合
# 1. /etc/bash.bashrc
# 2. ~/.bashrc
# 設定ファイルの依存関係を可視化
echo "=== 設定ファイルの読み込みチェーン ==="
grep -H "source\|^\." ~/.bash* ~/.profile 2>/dev/null
環境変数の設定と管理
一時的な設定
# 現在のシェルのみ
MYVAR="value"
export MYVAR="value"
# コマンド実行時のみ
LANG=C date
DEBUG=1 ./script.sh
# サブシェルで実行
(export TEMP_VAR="temp"; echo $TEMP_VAR)
echo $TEMP_VAR # 空(親シェルには影響なし)
永続的な設定
# ~/.bashrcに追加
echo 'export MYAPP_HOME="/opt/myapp"' >> ~/.bashrc
source ~/.bashrc
# 条件付き設定
cat >> ~/.bashrc << 'EOF'
# Pythonの仮想環境
if [ -d "$HOME/venv" ]; then
export VIRTUAL_ENV="$HOME/venv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
fi
EOF
# PATHの追加(重複を避ける)
cat >> ~/.bashrc << 'EOF'
# PATHに追加(重複チェック付き)
add_to_path() {
if [[ ":$PATH:" != *":$1:"* ]]; then
export PATH="$1:$PATH"
fi
}
add_to_path "/usr/local/bin"
add_to_path "$HOME/bin"
EOF
トラブルシューティング
環境変数が反映されない
# 原因1:sourceし忘れ
source ~/.bashrc
# または
. ~/.bashrc
# 原因2:ログインシェルではない
echo $0 # -bashならログインシェル
bash -l # ログインシェルとして起動
# 原因3:設定ファイルの構文エラー
bash -n ~/.bashrc # 構文チェック
# 原因4:exportし忘れ
MYVAR="value" # シェル変数(子プロセスに継承されない)
export MYVAR # 環境変数に昇格
PATHの問題を診断
#!/bin/bash
# PATH診断スクリプト
echo "=== PATH診断 ==="
# 存在しないディレクトリ
echo "存在しないPATHエントリ:"
IFS=':' read -ra DIRS <<< "$PATH"
for dir in "${DIRS[@]}"; do
[ ! -d "$dir" ] && echo " ✗ $dir"
done
# 重複エントリ
echo -e "\n重複したPATHエントリ:"
echo "$PATH" | tr ':' '\n' | sort | uniq -d | while read dir; do
echo " ! $dir"
done
# セキュリティリスク(カレントディレクトリ)
echo -e "\nセキュリティチェック:"
[[ ":$PATH:" == *"::"* ]] && echo " ⚠ 空のPATHエントリ(カレントディレクトリ)"
[[ ":$PATH:" == *":."* ]] && echo " ⚠ カレントディレクトリ(.)がPATHに含まれています"
便利なスクリプト集

環境変数バックアップ
#!/bin/bash
# 環境変数のバックアップ
backup_env() {
local backup_file="$HOME/.env_backup_$(date +%Y%m%d_%H%M%S)"
printenv > "$backup_file"
echo "環境変数をバックアップしました: $backup_file"
}
# 環境変数の復元
restore_env() {
local backup_file="$1"
if [ -f "$backup_file" ]; then
while IFS='=' read -r key value; do
export "$key=$value"
done < "$backup_file"
echo "環境変数を復元しました: $backup_file"
else
echo "バックアップファイルが見つかりません: $backup_file"
fi
}
環境変数の比較
#!/bin/bash
# 2つの環境の差分を確認
compare_env() {
echo "=== 環境変数の差分 ==="
# 現在の環境を保存
printenv | sort > /tmp/env1.txt
# 新しいシェルで環境を取得
bash -l -c 'printenv | sort' > /tmp/env2.txt
# 差分表示
diff -u /tmp/env1.txt /tmp/env2.txt
# クリーンアップ
rm -f /tmp/env1.txt /tmp/env2.txt
}
環境変数の可視化
#!/bin/bash
# 環境変数を見やすく表示
show_env() {
printenv | sort | while IFS='=' read -r key value; do
# 値が長い場合は省略
if [ ${#value} -gt 50 ]; then
value="${value:0:47}..."
fi
printf "%-20s = %s\n" "$key" "$value"
done
}
# PATHを見やすく表示
show_path() {
echo "=== PATH内のディレクトリ ==="
echo "$PATH" | tr ':' '\n' | nl
}
Docker/コンテナでの環境変数
# Dockerコンテナ内の環境変数確認
docker exec container_name printenv
# docker-composeの環境変数
docker-compose run --rm app printenv
# Kubernetesポッドの環境変数
kubectl exec pod_name -- printenv
# 環境変数を渡してコンテナ起動
docker run -e MYVAR=value -e DEBUG=1 image_name
セキュリティの考慮
# パスワードなど機密情報を含む環境変数を隠す
printenv | grep -v -E 'PASS|TOKEN|SECRET|KEY|API'
# 環境変数の履歴を削除
unset HISTFILE # 履歴を記録しない
history -c # 現在の履歴をクリア
# 一時的に機密情報を設定
read -s -p "Password: " PASSWORD
export PASSWORD
# 使用後は必ず削除
unset PASSWORD
まとめ:環境変数確認チートシート
基本的な確認:
printenv # すべて表示
printenv PATH # 特定の変数
echo $PATH # 値のみ表示
env | grep XXX # 検索
詳細な確認:
declare -x # エクスポート変数
export -p # エクスポート形式
set # すべての変数
設定ファイル:
/etc/profile # システム全体
~/.bashrc # ユーザー個別
source ~/.bashrc # 再読み込み
トラブルシューティング:
echo $PATH | tr ':' '\n' # PATH確認
which command # コマンド位置
type command # コマンドタイプ
環境変数を理解することは、 Linuxシステムを使いこなす第一歩です!
適切に管理・活用して、 快適な開発環境を構築しましょう。
コメント