export の意味:export とは、シェル変数を「環境変数」に昇格させ、子プロセスに引き継がせるコマンドです。FOO=bar だけでは現在のシェル内だけの変数ですが、export FOO=bar にすると子プロセス(外部コマンドやスクリプト)からも参照できます。PATH の追加、APIキーの受け渡し、ビルドスクリプトや Docker/CI の設定など、日常の開発・運用で頻出します。
export 意味を一言で:シェル変数を環境変数に昇格させて、子プロセスへ引き継がせるスイッチ。
本記事では 設定/確認/削除 を軸に、一時設定と永続設定の違い、env/printenv/unset との使い分け、子プロセス継承の仕組み を図と実行例で整理します。
本記事ではexportコマンドについて解説しています。コマンドラインでの実行をするツールのためコマンド操作が不慣れな方は「Bash」の記事を参照してください。
- 結論
- export とは(シェル変数と環境変数の違い)
- どの場面で export が必要か
- 基本構文とオプション(-p/-n/-f)
- export の実行例 – 環境変数を設定する(即時/一時/一括)
- 確認する(export -p/printenv/env/declare -x)
- Linuxで環境変数を削除する方法
- 一時設定 vs 永続設定(.bashrc/.bash_profile/PATH)
- 子プロセス継承の挙動(比較実験)
- よくある誤解:source との違い・export しないとどうなるか
- export の代表的な実務例(APIキー・PATH・外部アプリ)
- よくあるエラー/ハマりどころ
- 似たコマンドとの違い(env/set/declare)
- セキュリティとベストプラクティス
- よくある質問(FAQ)
- 参考
- 関連記事
結論
先に結論として、環境変数について以下の事ができます。
- 設定:
export NAME=value(既存変数を環境変数化するならexport NAME) - 確認:
export -p(宣言一覧)/printenv NAME/env | grep NAME - 削除:
unset NAME(環境変数・シェル変数どちらも解除) - 永続化:
~/.bashrc(対話シェル)や~/.bash_profile(ログインシェル)にexport ...を追記
export とは(シェル変数と環境変数の違い)
- シェル変数:現在のシェル内だけで有効(例:
FOO=bar)。 - 環境変数:子プロセスにも継承される。
exportで昇格させる。
親シェル(bash)
├─ 子プロセス(bash -c ...)← export された変数だけ見える
└─ 外部コマンド(python/node/grep など)← 同上
要点:export は “見える範囲(スコープ)を広げる” スイッチ。
変数代入と export の違い(比較表)
| 操作 | 書き方 | 現在のシェルで参照 | 子プロセスで参照 |
|---|---|---|---|
| 変数代入のみ | FOO=bar | ○ できる | × できない |
| export あり | export FOO=bar | ○ できる | ○ できる |
「子プロセス」とは、現在のシェルから起動した外部コマンドやスクリプトのことです。FOO=bar だけでは bash -c 'echo $FOO' や python main.py には値が届きません。export を付けることで初めて子プロセス側から参照できます。
どの場面で export が必要か
日常の開発・運用で export が登場する代表的な3つの場面を紹介します。
① PATH を通す
export PATH=”$HOME/.local/bin:$PATH”
インストールしたツールをどこからでも呼び出せるようにするため、PATH を export します。シェルが起動するたびに有効にしたい場合は ~/.bashrc に追記して永続化します。
② Node.js / Python など実行環境の設定
# Node.js に環境を伝える
export NODE_ENV=production
node app.js
# Python スクリプトに設定を渡す
export DATABASE_URL=”postgres://user:pass@localhost/db”
python main.py
外部アプリは環境変数を読み取って動作を切り替えます。export しないと値が届かず、アプリ側で空文字やデフォルト値が使われてしまいます。
③ シェルスクリプトから外部コマンドへ値を渡す
#!/usr/bin/env bash
export APP_MODE=production
./build.sh # build.sh 内で $APP_MODE を参照できる
スクリプト間で値を引き継ぐ場合も export が必要です。APP_MODE=production だけ書いても、./build.sh の中では値が空になります。
基本構文とオプション(-p/-n/-f)
# 基本構文
export [オプション] [変数名[=値]]
# 値と同時に環境変数化
export NAME=value
# 既存のシェル変数を環境変数化
NAME=value
export NAME
# 登録済みの環境変数一覧
export -p
# 関数をエクスポート(bash固有・子シェルに関数を渡す)
export -f funcname
# エクスポート属性の解除(環境変数→シェル変数に戻す)
export -n NAME
メモ:
export -nは属性解除であって 変数自体を消すわけではありません(値は残る)。完全に消すならunset NAME。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | すべての環境変数を表示 | export |
変数名=値 | 環境変数を設定 | export PATH=/usr/local/bin:$PATH |
変数名 | 既存のシェル変数を環境変数として登録 | MYVAR=hello; export MYVAR |
-n 変数名 | 環境変数の登録を解除(値は保持) | export -n MYVAR |
-p | すべての環境変数を一覧表示(POSIX形式) | export -p |
export の実行例 – 環境変数を設定する(即時/一時/一括)
即時設定(よく使う)
export API_KEY="abc123"
一時設定(コマンド 1 回だけ)
API_KEY="abc123" some_command # 左の設定は some_command の実行中にのみ有効
まとめて設定(読み込み)
# .env などから読み込む(安全のため自作する)
set -a # 以降の読み込みで自動export
. ./my.env # or source ./my.env
set +a
確認する(export -p/printenv/env/declare -x)
export -p # bash の「宣言」一覧(declare -x と同義)
printenv NAME # 値だけ表示(空なら無出力・終了コード 1)
env | grep NAME # 環境変数の生リストから検索
declare -x NAME # bash の宣言テーブル(デバッグで便利)
Linuxで環境変数を削除する方法
環境変数を削除するには unset コマンドを使います。削除には「一時削除(現在のセッションのみ)」と「永続削除(設定ファイルから削除)」の2種類があります。
一時削除(現在のセッションのみ)
現在開いているターミナル(セッション)でのみ環境変数を削除するには unset コマンドを使います。ターミナルを閉じて開き直すと、設定ファイルが再読み込みされて変数が復活する点に注意してください。
# 環境変数を削除する(現在のセッションのみ有効)
unset MYVAR
unset 変数名:環境変数もシェル変数も完全に削除される。export -n 変数名:エクスポート属性だけ外す(変数は残る)。子プロセスへの継承を止めたいだけの場合に使う。
削除を確認する(env / printenv / echo)
unset 後は以下のコマンドで正しく削除されたか確認できます。いずれも何も表示されなければ削除成功です。
echo $MYVAR # 変数の値を表示(削除済みなら何も表示しない)
printenv MYVAR # 環境変数の値のみ表示(未定義なら無出力・終了コード 1)
env | grep MYVAR # 環境変数一覧から検索
永続削除(.bashrc / .profile から削除)
unset はあくまで現在のセッションでしか有効ではありません。ターミナルを開き直すと ~/.bashrc や ~/.profile が再度読み込まれ、変数が復活します。完全に削除するには設定ファイル自体を編集する必要があります。
# 1. 設定ファイルを開く
nano ~/.bashrc # または vim ~/.bashrc
# 2. 対象の export 行を削除する(例)
# export MYVAR=hello ← この行を削除
# 3. 変更を現在のセッションに反映する
source ~/.bashrc # または . ~/.bashrc
| 設定ファイル | 読み込まれるタイミング |
|---|---|
~/.bashrc | ターミナル(インタラクティブシェル)を開くたび |
~/.bash_profile | SSH ログイン・ログインシェル起動時 |
~/.profile | bash 以外のシェルや POSIX 互換環境 |
PATH を削除・変更するときの注意点
PATH を誤って削除すると、ls や cd などの基本コマンドが一切使えなくなります。操作には十分注意してください。
# PATH の現在値を確認
echo $PATH
# 特定のパスだけ取り除く(:区切りで検索・削除)
export PATH=$(echo $PATH | tr ':' '\n' | grep -v '/usr/local/bin' | tr '\n' ':' | sed 's/:$//')
# 万が一 PATH を壊してしまった場合の最小限の復元
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- 絶対にやってはいけない:
unset PATH(全コマンドが使えなくなる)。 - 永続変更は慎重に:
~/.bashrcの変更前にバックアップを取っておく(cp ~/.bashrc ~/.bashrc.bak)。
export と unset の関係(比較表)
| 操作 | コマンド | 変数は残るか | 子プロセスに渡るか |
|---|---|---|---|
| 環境変数として設定 | export NAME=value | 残る | 渡る |
| エクスポート属性を外す | export -n NAME | 残る | 渡らない |
| 完全に削除 | unset NAME | 消える | 渡らない |
一時設定 vs 永続設定(.bashrc/.bash_profile/PATH)
| 目的 | 設定場所 | 例 |
|---|---|---|
| 対話的シェルで常に使いたい | ~/.bashrc | export PATH="$HOME/.local/bin:$PATH" |
| ログイン時に一度だけ実行 | ~/.bash_profile(※) | export EDITOR=vim |
※ 多くの環境で
~/.bash_profileから~/.bashrcを読み込む記述が入っています。
WSL/デスクトップLinux は.bashrc、SSHログインやmacOSは.bash_profileなど運用差に注意。
PATH の永続追加(安全テンプレ)
# 末尾に追記
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# 反映
. ~/.bashrc # または source ~/.bashrc
子プロセス継承の挙動(比較実験)
# 1) export なし:子プロセスに渡らない
$ MYVAR=hello
$ bash -c 'echo "$MYVAR"'
# (無出力)
# 2) export あり:子プロセスに渡る
$ export MYVAR
$ bash -c 'echo "$MYVAR"'
hello
よくある誤解:source との違い・export しないとどうなるか
export しないとどうなるか
export なしで変数を定義した場合、その変数は現在のシェルにしか存在しない「シェル変数」です。子プロセスとして起動した外部コマンドやスクリプトからは一切参照できません。
# export なし → 子プロセスから見えない
$ MY_VAR=hello
$ bash -c 'echo "$MY_VAR"'
# (何も表示されない)
# export あり → 子プロセスから見える
$ export MY_VAR=hello
$ bash -c 'echo "$MY_VAR"'
hello
source との違い
source(または .)と export は、よく混同される組み合わせです。役割がまったく異なります。
| コマンド | 役割 | 変数の有効範囲 |
|---|---|---|
source file.sh | スクリプトを現在のシェルで実行(新プロセスを作らない) | 現在のシェル内に変数が展開される |
export VAR=value | 変数を環境変数として子プロセスへ引き継ぐ | 子プロセス(サブシェル・外部コマンド)でも参照可能 |
# source の場合:file.sh の内容を現在のシェルで実行
$ source ./config.sh # config.sh 内の変数が現在のシェルに展開される
$ echo $DEFINED_IN_CONFIG # 値が表示される(source したから)
# source した変数を子プロセスに渡すには export が必要
$ export DEFINED_IN_CONFIG
$ bash -c 'echo $DEFINED_IN_CONFIG' # 子プロセスでも見える
よくある誤解:「source すれば子プロセスにも変数が渡る」→ 誤り。source は現在のシェルで実行するだけで、子プロセスへの引き継ぎには export が必要です。
export の代表的な実務例(APIキー・PATH・外部アプリ)
API キーを渡してコマンド実行
export OPENAI_API_KEY="sk-xxxxx"
curl -H "Authorization: Bearer $OPENAI_API_KEY" https://api.example.com/v1/ping
Node/Python など外部アプリへ受け渡し
# Node.js
export NODE_ENV=production
node app.js
# Python
export DATABASE_URL="postgres://user:pass@localhost/db"
python main.py
スクリプト内の export 位置(依存コマンドより前)
#!/usr/bin/env bash
set -euo pipefail
export PATH="$HOME/.local/bin:$PATH"
export APP_ENV=production
run_build # ← ここで APP_ENV を参照
よくあるエラー/ハマりどころ
| 症状 | 原因 | 対処 |
|---|---|---|
export: command not found | sh/dash で実行している | bash で実行 or #!/usr/bin/env bash を先頭へ |
| 設定が再ログインで消える | 一時設定のみで永続化していない | ~/.bashrc or ~/.bash_profile に追記 |
| 値にスペースがあると崩れる | クォート漏れ | export TITLE="Hello World" のように "..." |
| 期待したコマンドが見つからない | PATH の前後順ミス | 先頭に追加で上書き優先:export PATH="$HOME/bin:$PATH" |
| 変数が子に渡らない | export していない | export NAME を追加 |
似たコマンドとの違い(env/set/declare)
| コマンド | 役割 | 例 |
|---|---|---|
export | エクスポート属性の付与/表示 | export NAME=value / export -p |
env | 一時的な環境でコマンド実行/環境一覧 | env NAME=value cmd / env |
printenv | 環境変数の値を表示 | printenv PATH |
set | シェルの オプション/シェル変数 表示・設定 | set -euo pipefail |
declare -x | bashの 環境変数宣言(export と同義的) | declare -x NAME="val" |
セキュリティとベストプラクティス
- シークレットは履歴に残さない:
export API_KEY=...をそのまま履歴に残さない(例:HISTCONTROL=ignorespaceを使い、先頭にスペースをつける習慣)
export API_KEY="sk-xxxx" # 先頭スペースで履歴抑制(ignorespace有効時)
.envを使い分け:ローカル用.envは Git 管理外(.gitignore)。本番は 環境変数注入(CI/CD・Secrets管理) を推奨。- 最小権限:PATH の先頭にユーザー任意パスを入れると上書き実行のリスク。運用ポリシーに沿って順序管理。
export -f(関数のエクスポート)は限定的に:挙動の相違や可搬性に注意。
よくある質問(FAQ)
通常の変数代入(VAR=value)は現在のシェルのみで有効で、子プロセスには引き継がれません。export VAR=value とすると環境変数になり、そのシェルから起動した子プロセス・スクリプト・コマンドにも渡されます。
はい。export だけでは現在のセッション(ターミナル)限りで、閉じると消えます。永続化するには ~/.bashrc や ~/.bash_profile に export VAR=value を追記し、source ~/.bashrc で再読み込みします。
export -p、env、printenv の3つが使えます。特定の変数だけ確認したい場合は echo $VAR または printenv VAR が手軽です。
export は変数を子プロセスに渡す仕組みで、source(または .)は別ファイルのシェルスクリプトを現在のシェルで実行する仕組みです。source script.sh でスクリプト内の export を実行すると、現在のシェルに変数が設定されます。
export PATH="$PATH:/new/directory" と書くことで既存の PATH に追記できます。~/.bashrc に追加すれば永続化されます。先頭に追加したい場合は export PATH="/new/directory:$PATH" とします。

コメント