Linuxで環境変数を設定・確認・永続化するには、export コマンド、printenv / echo コマンド、そして ~/.bashrc への追記設定を組み合わせるのが基本です。
「ターミナルを閉じたら設定した変数が消えてしまった」「シェルスクリプトの中から環境変数が参照できない」「PATHを追加しようとして既存のコマンドが動かなくなった」といったトラブルは、実務の現場でも非常によく発生します。
この記事では、今すぐコピペで使える最短コマンドから、環境変数とシェル変数のスコープの違い、~/.bashrc による永続化と source 反映手順、安全なPATH追加の鉄則までを網羅して分かりやすく解説します。
シェル設定全体の構造やBashの基礎から学びたい方は、【Linuxコマンド一覧・早見表】主要コマンド・オプション逆引き完全ガイドもあわせてご活用ください。
【コピペ用】環境変数の設定・確認・反映・永続化の最短コマンド
実務で頻繁に使う操作の最短1行コマンド集です。用途に合わせてコマンドをコピーしてご利用ください。
# 1. 環境変数を設定する(現在のセッションのみ)
export MY_VAR="hello_world"
# 2. 環境変数の値を確認する
echo "$MY_VAR"
printenv MY_VAR
# 3. すべての環境変数を一覧表示する
printenv
# または
env
# 4. PATH環境変数に新しいディレクトリを安全に追加する
export PATH="$PATH:/usr/local/myapp/bin"
# 5. 環境変数をユーザー単位で永続化する(.bashrcへ追記して即時反映)
echo 'export MY_VAR="hello_world"' >> ~/.bashrc
source ~/.bashrc
# 6. 環境変数を削除(無効化)する
unset MY_VAR
変数確認・設定コマンドの使い分け早見表
Linuxで変数を扱うコマンドは複数存在します。それぞれの確認対象と用途の違いは以下の通りです。
| コマンド | 操作・対象 | 特定変数の指定 | 主な特徴・使い分け |
|---|---|---|---|
export | 設定(環境変数化) | ○ 可能 ( export VAR="val") | シェル変数を環境変数として定義・昇格させ、子プロセスへ引き継げるようにする。 |
printenv | 確認(環境変数のみ) | ○ 可能 ( printenv PATH) | 環境変数の確認で最も推奨されるコマンド。変数名の指定やスクリプト内での値取得に最適。 |
echo "$VAR" | 確認(環境変数+シェル変数) | ○ 可能 ( echo "$PATH") | 手軽に値を確認したいときに多用。ただし環境変数とシェル変数の区別はつかない。 |
env | 一覧表示 / 一時実行 | × 不可(引数なしで全一覧) | 本来は「変数を一時変更して別コマンドを実行する」コマンド。単体実行で全一覧表示。 |
set | 一覧表示(全変数+関数) | × 不可 | シェル変数・環境変数・定義済み関数をすべて一覧表示。デバッグ用途で使用。 |
unset | 削除(変数・環境変数) | ○ 可能 ( unset VAR) | 定義済みの環境変数やシェル変数をメモリ上から削除・無効化する。 |
環境変数とは?シェル変数との決定的な違い(スコープ解説)
Linuxのシェル(Bashなど)で扱う変数には、大きく分けて「シェル変数」と「環境変数」の2種類があります。
この2つの決定的な違いは、「子プロセス(サブシェルや別スクリプト)に値が引き継がれるかどうか(スコープの広さ)」にあります。
- シェル変数: 現在のシェルセッション内部だけで有効。外部のスクリプトや子プロセスからは参照できない。
- 環境変数: 現在のシェルだけでなく、そのシェルから起動されたすべての子プロセス(実行コマンドやシェルスクリプト)へ自動的に継承される。
【検証実例】シェル変数と環境変数のスコープ比較
実際のターミナル操作で違いを確認してみましょう。まず、通常の代入(シェル変数)と export(環境変数)で変数を定義します。
# シェル変数を定義(現在のシェルのみ)
SHELL_LOCAL="I am local"
# 環境変数を定義(子プロセスへ引き継がれる)
export ENV_GLOBAL="I am global"
# 現在のシェル上ではどちらも参照できる
echo "$SHELL_LOCAL" # => I am local
echo "$ENV_GLOBAL" # => I am global
ここで、新しいサブシェル(bash -c)を起動して子プロセスから両方の変数を参照してみます。
# 子プロセス(サブシェル)から参照を試みる
bash -c 'echo "LOCAL: $SHELL_LOCAL | GLOBAL: $ENV_GLOBAL"'
# 【実行結果】
# LOCAL: | GLOBAL: I am global
上記のように、シェル変数 $SHELL_LOCAL は子プロセスに引き継がれず空文字になりますが、export で定義した環境変数 $ENV_GLOBAL はしっかりと子プロセスへ渡されていることが分かります。
「自作のシェルスクリプトを実行したら、ターミナルで設定したはずの変数が空になっていた」という場合は、export を付け忘れてシェル変数として定義してしまっていることが主な原因です。
exportコマンドの使い方(設定・変更・PATH追加)
export コマンドは、変数を環境変数として定義、または既存のシェル変数を環境変数へ昇格させるBash組み込みコマンドです。
1. 基本的な環境変数の設定構文
# 基本構文
export 変数名="値"
# 設定例
export APP_ENV="production"
export DB_PORT="5432"
【記述の鉄則】
=の前後にスペースを入れない:export VAR = "val"と書くと構文エラー(command not found)になります。- 値はダブルクォートで囲む: 空白や特殊文字が含まれる場合の意図しない単語分割(Word Splitting)を防ぐため、ダブルクォート
"..."で囲むのが安全です。
2. 既存のシェル変数をあとから環境変数にする
すでに定義されているシェル変数に対して変数名のみを export に渡すことで、環境変数へ変換することも可能です。
# シェル変数を定義
MY_DATA="sample_value"
# 環境変数へ昇格(値の再代入は不要)
export MY_DATA
3. 【超重要】PATH環境変数への安全なパス追加手順
実務で最も頻出する export の用途が、コマンド検索パス PATH の追加です。PATH はコロン(:)区切りでディレクトリが並んでおり、左側のディレクトリから優先してコマンドが検索されます。
パスを追加する際は、必ず既存の $PATH を含めて代入する必要があります。
# パスの末尾に追加する(標準コマンドを優先したい場合)
export PATH="$PATH:/home/user/.local/bin"
# パスの先頭に追加する(追加したツールのコマンドを優先したい場合)
export PATH="/usr/local/custom/bin:$PATH"
# 現在のPATH一覧を確認する
echo "$PATH"
# コロンごとに改行して見やすく確認するテクニック
echo "$PATH" | tr ':' '\n'
【危険な落とし穴】
もし export PATH="/home/user/.local/bin" のように $PATH を含めずに上書きしてしまうと、ls や grep、mkdir などの標準コマンドが一切見つからなくなります(復旧方法は後述)。必ず $PATH:〜 または 〜:$PATH の形式で記述してください。
環境変数を永続化する完全手順(.bashrc / /etc/environment)
ターミナル上で export コマンドを実行して設定した環境変数は、「現在のシェルセッションのメモリ上」にのみ保持されます。そのため、ターミナルを閉じたりSSHを切断したり、システムを再起動すると消えてしまいます。
次回ログイン時以降も永続的に環境変数を有効化するには、設定ファイルに export 記述を保存する必要があります。
永続化設定ファイルの使い分け
| 設定ファイル | 適用スコープ | 読み込みタイミング | 主な用途 |
|---|---|---|---|
~/.bashrc | 特定ユーザーのみ | 対話型非ログインシェル起動時 (通常の端末起動・SSHログイン後) | 個人用環境変数の設定で最も一般的。PATH追加やエイリアス設定。 |
~/.bash_profile(または ~/.profile) | 特定ユーザーのみ | ログインシェル起動時 (SSH初回接続時・コンソールログイン) | ログイン時のみ1回実行したい環境変数設定(通常は内部で ~/.bashrc を呼び出す)。 |
/etc/environment | システム全体(全ユーザー) | PAMログイン時(シェル問わず) | シンプルな KEY=VALUE 形式(export不要)。サーバー共通のデフォルト設定。 |
/etc/profile.d/*.sh | システム全体(全ユーザー) | 全ユーザーのログイン時 | スクリプト形式で共通の環境変数やPATHを一括配布する標準的な管理場所。 |
~/.bashrc と ~/.bash_profile の詳細な読み込み順序や使い分けについては、.bashrcとは?書き方・反映方法や.bash_profileとの違いを徹底解説で詳しく解説しています。
手順1: ユーザー個別で永続化する(~/.bashrc)
最も手軽で推奨される方法です。エディタ(nano や vim)で ~/.bashrc の末尾に設定を追記します。
# エディタで開いて編集する場合
nano ~/.bashrc
# --- ~/.bashrc の最下行に追記する内容 ---
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
export PATH="$PATH:$JAVA_HOME/bin"
export APP_CONFIG_DIR="/home/user/.config/myapp"
# ------------------------------------
コマンドラインからワンライナーで追記する場合は、リダイレクト >>(追記)を使用します(> で上書きしないよう十分注意してください)。
# リダイレクトで ~/.bashrc の末尾に追記
echo 'export APP_CONFIG_DIR="/home/user/.config/myapp"' >> ~/.bashrc
手順2: sourceコマンドで即時反映する
設定ファイルを編集しただけでは、現在開いているターミナルには反映されません。ターミナルを再起動するか、source コマンド(または . コマンド)を実行して設定ファイルを即座に再読み込みします。
# 編集した ~/.bashrc を現在のシェルに即時反映
source ~/.bashrc
# (短縮記号ドットでも同じ動作になります)
. ~/.bashrc
# 正しく反映されたか確認
printenv APP_CONFIG_DIR
source コマンドの仕組みやスクリプト実行(sh script.sh)との違いについて詳しく知りたい方は、sourceコマンドの使い方・活用例・注意点まとめ【Bash】をご覧ください。
手順3: サーバー全体で永続化する(/etc/profile.d/)
複数ユーザーが存在するサーバーで共通の環境変数を定義したい場合は、/etc/profile.d/ 配下に拡張子 .sh のスクリプトを作成するのがベストプラクティスです。
# root権限で設定スクリプトを作成
sudo nano /etc/profile.d/custom_env.sh
# --- /etc/profile.d/custom_env.sh の内容 ---
export SHARED_TOOL_PATH="/opt/shared/bin"
export PATH="$PATH:$SHARED_TOOL_PATH"
# -----------------------------------------
# 権限を付与(読み取り・実行権限)
sudo chmod 644 /etc/profile.d/custom_env.sh
全ユーザーの次回ログイン時に自動的にこのスクリプトが読み込まれ、環境変数が適用されます。
環境変数の確認・一覧表示テクニック(printenv / env / echo)
環境変数が正しく設定されているか、どのような値が渡されているかを確認するための主要コマンドと実践的なフィルタリング手法です。
1. 特定の環境変数を確認する(printenv / echo)
# printenv で確認(変数名に $ は不要)
printenv PATH
printenv HOME
# echo で確認(変数名の前に $ を付ける)
echo "$PATH"
echo "$USER"
printenv は指定した変数が存在しない場合に終了ステータス 1 を返すため、シェルスクリプト内の条件分岐で存在判定を行う際にも役立ちます。
2. すべての環境変数を一覧表示・grep検索する
# 全環境変数の一覧を表示
printenv
# grep と組み合わせて特定のキーワードを含む環境変数を抽出
printenv | grep -i "proxy"
printenv | grep -E "^(PATH|HOME|SHELL)="
3. 【実務テク】起動中プロセス(PID)の環境変数を確認する
「すでにバックグラウンドで動作しているWebサーバーやバッチ処理に、正しく環境変数が渡されているか確認したい」という場合は、Linuxの /proc/<PID>/environ ファイルを確認します。
# プロセスID(例: 1234)の環境変数をNull文字区切り(\0)から改行に変換して表示
cat /proc/1234/environ | tr '\0' '\n'
# 特定の変数を検索する場合
cat /proc/1234/environ | tr '\0' '\n' | grep "DB_HOST"
4. コマンド実行時だけ一時的に環境変数を渡す
現在のシェル環境を汚さずに、特定のコマンド実行時だけ変数を渡したい場合は、コマンドの直前に 変数名=値 を記述します。
# この実行時のみ PORT=8080 が渡される(現在のシェルには残らない)
PORT=8080 node server.js
# または env コマンドを使用
env ENVIRONMENT=staging ./run_migration.sh
環境変数を削除・無効化する(unset)
不要になった環境変数やシェル変数を現在のセッションから完全に消去するには unset コマンドを使用します。
# 環境変数を削除
unset MY_VAR
# 削除されたか確認(何も出力されなければ成功)
echo "$MY_VAR"
printenv MY_VAR
【注意点】~/.bashrc などに記述されている変数の場合、~/.bashrc 内の行を削除しても現在起動中のターミナルメモリ上には残ったままになります。即座に反映させたい場合は、unset コマンドを実行するか、ターミナルを再起動してください。
実務でよくあるトラブル・落とし穴と対処法
1. PATHを上書きして標準コマンド(ls, nano等)が消えた場合の緊急復旧
誤って export PATH="/new/bin" と実行してしまい、ls: command not found や sudo: command not found となってしまった場合の復旧手順です。
# フルパスで一時的にPATHを標準状態へ再設定する
/usr/bin/export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 復旧を確認
ls -la
上記でコマンドが動作するようになったら、~/.bashrc の記述ミスを修正して保存してください。
2. cronやsystemdサービスで環境変数が反映されない
「手動でスクリプトを実行すると動くのに、cronやsystemdで自動実行すると環境変数が見つからずエラーになる」というのは実務で最も多いトラブルの一つです。
原因: cronやsystemdは「非対話型・非ログインシェル」として起動するため、ユーザーの ~/.bashrc や ~/.bash_profile を自動で読み込みません。
- cronの対策: crontabの冒頭で環境変数を明示するか、スクリプト内で
source ~/.bashrcを実行する。 - systemdの対策: サービス定義ファイル(
.service)の[Service]セクション内にEnvironment="VAR=value"またはEnvironmentFile=/path/to/envfileを指定する。
3. 子スクリプト内で export した変数が親シェルに戻らない
シェルスクリプト ./setup.sh の中で export DB_NAME="mydb" と記述して sh setup.sh や ./setup.sh で実行しても、スクリプト終了後の親シェルには変数は反映されません(子プロセスから親プロセスの環境は書き換えられないため)。
現在のシェル自身に変数を反映させたいスクリプトは、必ず source ./setup.sh または . ./setup.sh で実行してください。
まとめ
- 設定と確認の基本: 一時的な環境変数の設定は
export VAR="値"、確認はprintenv VARまたはecho "$VAR"で行う。 - スコープの違い: シェル変数は現在のシェル限定、環境変数は子プロセス(外部スクリプト・コマンド)へ自動継承される。
- 永続化の手順: ログイン後も維持するには
~/.bashrcに追記し、source ~/.bashrcで即時反映させる。PATH追加時は必ず$PATHを含める。
環境変数の仕組みとスコープを正しく理解することは、シェルスクリプトの自動化やLinuxサーバー管理の安全性を高めるための基礎となります。ぜひ日々の実務に役立ててください。
