Linux環境変数の確認・設定完全ガイド!printenv・env・exportの全活用法

Linux

「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システムを使いこなす第一歩です!

適切に管理・活用して、 快適な開発環境を構築しましょう。


コメント

タイトルとURLをコピーしました