export 意味とは?環境変数を子プロセスに引き継ぐBashコマンドの使い方

コマンドリファレンス

export の意味export とは、シェル変数を「環境変数」に昇格させ、子プロセスに引き継がせるコマンドです。FOO=bar だけでは現在のシェル内だけの変数ですが、export FOO=bar にすると子プロセス(外部コマンドやスクリプト)からも参照できます。PATH の追加、APIキーの受け渡し、ビルドスクリプトや Docker/CI の設定など、日常の開発・運用で頻出します。

export 意味を一言で:シェル変数を環境変数に昇格させて、子プロセスへ引き継がせるスイッチ。

本記事では 設定/確認/削除 を軸に、一時設定と永続設定の違いenv/printenv/unset との使い分け、子プロセス継承の仕組み を図と実行例で整理します。

本記事ではexportコマンドについて解説しています。コマンドラインでの実行をするツールのためコマンド操作が不慣れな方は「Bash」の記事を参照してください。

  1. 結論
  2. export とは(シェル変数と環境変数の違い)
    1. 変数代入と export の違い(比較表)
  3. どの場面で export が必要か
    1. ① PATH を通す
    2. ② Node.js / Python など実行環境の設定
    3. ③ シェルスクリプトから外部コマンドへ値を渡す
  4. 基本構文とオプション(-p/-n/-f)
    1. 主なオプション一覧
  5. export の実行例 – 環境変数を設定する(即時/一時/一括)
    1. 即時設定(よく使う)
    2. 一時設定(コマンド 1 回だけ)
    3. まとめて設定(読み込み)
  6. 確認する(export -p/printenv/env/declare -x)
  7. Linuxで環境変数を削除する方法
    1. 一時削除(現在のセッションのみ)
    2. 削除を確認する(env / printenv / echo)
    3. 永続削除(.bashrc / .profile から削除)
    4. PATH を削除・変更するときの注意点
    5. export と unset の関係(比較表)
  8. 一時設定 vs 永続設定(.bashrc/.bash_profile/PATH)
    1. PATH の永続追加(安全テンプレ)
  9. 子プロセス継承の挙動(比較実験)
  10. よくある誤解:source との違い・export しないとどうなるか
    1. export しないとどうなるか
    2. source との違い
  11. export の代表的な実務例(APIキー・PATH・外部アプリ)
    1. API キーを渡してコマンド実行
    2. Node/Python など外部アプリへ受け渡し
    3. スクリプト内の export 位置(依存コマンドより前)
  12. よくあるエラー/ハマりどころ
  13. 似たコマンドとの違い(env/set/declare)
  14. セキュリティとベストプラクティス
  15. よくある質問(FAQ)
  16. 参考
  17. 関連記事

結論

先に結論として、環境変数について以下の事ができます。

  • 設定export NAME=value(既存変数を環境変数化するなら export NAME
  • 確認export -p(宣言一覧)/printenv NAMEenv | 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_profileSSH ログイン・ログインシェル起動時
~/.profilebash 以外のシェルや POSIX 互換環境

PATH を削除・変更するときの注意点

PATH を誤って削除すると、lscd などの基本コマンドが一切使えなくなります。操作には十分注意してください。

# 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)

目的設定場所
対話的シェルで常に使いたい~/.bashrcexport 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 foundsh/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 -xbashの 環境変数宣言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)

export とシェル変数(通常代入)の違いは何ですか?

通常の変数代入(VAR=value)は現在のシェルのみで有効で、子プロセスには引き継がれません。export VAR=value とすると環境変数になり、そのシェルから起動した子プロセス・スクリプト・コマンドにも渡されます。

export した変数はターミナルを閉じると消えますか?

はい。export だけでは現在のセッション(ターミナル)限りで、閉じると消えます。永続化するには ~/.bashrc~/.bash_profileexport VAR=value を追記し、source ~/.bashrc で再読み込みします。

export で設定した環境変数を一覧表示するには?

export -penvprintenv の3つが使えます。特定の変数だけ確認したい場合は echo $VAR または printenv VAR が手軽です。

export と source の違いは何ですか?

export は変数を子プロセスに渡す仕組みで、source(または .)は別ファイルのシェルスクリプトを現在のシェルで実行する仕組みです。source script.sh でスクリプト内の export を実行すると、現在のシェルに変数が設定されます。

PATH に新しいディレクトリを追加するには?

export PATH="$PATH:/new/directory" と書くことで既存の PATH に追記できます。~/.bashrc に追加すれば永続化されます。先頭に追加したい場合は export PATH="/new/directory:$PATH" とします。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント