export は 「シェル変数を子プロセスに引き継いで使える“環境変数”にする」 ためのコマンドです。
PATH の追加、APIキーの受け渡し、ビルドスクリプトや Docker/CI の設定など、日常の開発・運用で頻出します。
本記事では 設定/確認/削除 を軸に、一時設定と永続設定の違い、env/printenv/unset との使い分け、子プロセス継承の仕組み を図と実行例で整理します。
本記事ではexportコマンドについて解説しています。コマンドラインでの実行をするツールのためコマンド操作が不慣れな方は「Bash」の記事を参照してください。
- 結論
- export とは(シェル変数と環境変数の違い)
- 基本構文とオプション(-p/-n/-f)
- export の実行例 – 環境変数を設定する(即時/一時/一括)
- 確認する(export -p/printenv/env/declare -x)
- 削除する(unset と注意点)
- 一時設定 vs 永続設定(.bashrc/.bash_profile/PATH)
- 子プロセス継承の挙動(比較実験)
- export の代表的な実務例(APIキー・PATH・外部アプリ)
- よくあるエラー/ハマりどころ
- 似たコマンドとの違い(env/set/declare)
- セキュリティとベストプラクティス
- 参考
- export – 環境変数の設定/確認/削除のコマンドの使い方 の深掘り記事
- 関連記事
結論
先に結論として、環境変数について以下の事ができます。
- 設定:
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 は “見える範囲(スコープ)を広げる” スイッチ。
基本構文とオプション(-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 の宣言テーブル(デバッグで便利)
削除する(unset と注意点)
unset NAME # 変数を完全に削除(環境/シェルどちらも消える)
export -n NAME:エクスポート属性だけ外す(変数は残る)。- 推奨:確実に消したいときは
unset。
一時設定 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
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(関数のエクスポート)は限定的に:挙動の相違や可搬性に注意。
参考
- bashマニュアル: https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-export
- manページ(bash組み込み): https://man7.org/linux/man-pages/man1/bash.1.html

コメント