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

コマンドリファレンス

exportコマンドの意味:export とは、シェル変数を「環境変数」に昇格させ、子プロセスに引き継がせるためのBash組み込みコマンドです。通常の FOO=bar だけでは現在のシェルセッション内でのみ有効な「シェル変数」ですが、export FOO=bar と指定することで、起動した子プロセス(外部コマンドやシェルスクリプト、Python/Node.js等のアプリケーション)からも参照できるようになります。

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

PATH の追加、APIキーの受け渡し、ビルドスクリプトや Docker/CI の設定など、日常の開発・インフラ運用で export は必須のコマンドです。

本記事では、export の 基本構文・オプション(-p, -n, -f)、子プロセスや孫プロセスへ引き継がれる仕組み、実務で頻出する活用パターン、エラー対処法までを網羅して分かりやすく解説します。

環境変数全般の設定・確認(printenv / env)や ~/.bashrc による永続化の全体像を体系的に学びたい方は、【Linux】環境変数の設定・確認・永続化まとめ|exportコマンドの使い方と.bashrc反映手順もあわせて参考にしてください。

結論:exportコマンドでできること早見表

export コマンドと関連操作の要点をまとめると以下の通りです。

  • 設定(環境変数化):export NAME=value(既存変数を環境変数にするなら export NAME)
  • 属性解除(シェル変数へ戻す):export -n NAME(変数の値は維持したまま子プロセスへの継承を解除)
  • 一覧確認:export -p(宣言形式で一覧出力)/printenv NAME/env | grep NAME
  • 完全削除:unset NAME(環境変数・シェル変数をメモリ上から完全消去)
  • 永続化:~/.bashrc(対話シェル)や ~/.bash_profile(ログインシェル)に追記して source で反映

exportとは?シェル変数と環境変数の決定的な違い

Bashで扱う変数には、「シェル変数」と「環境変数」の2種類が存在します。

  • シェル変数:現在のシェルセッション内部だけで有効(例:FOO=bar)。外部スクリプトや子プロセスからは見えません。
  • 環境変数:現在のシェルから起動されたすべての子プロセスに自動継承される変数(例:export FOO=bar)。
親シェル(bash)
 ├─ 子プロセス(bash -c ...)← export された変数だけ見える
 │   └─ 孫プロセス(さらに起動されたコマンド)← export された変数はここにも届く
 └─ 外部コマンド(python / node / 自作スクリプト など)← export された変数が見える

変数代入と export のスコープ比較表

操作構文現在のシェルで参照子プロセス(スクリプト/外部コマンド)で参照
変数代入のみ(シェル変数)FOO=bar○ できる× できない(値は空文字)
exportあり(環境変数)export FOO=bar○ できる○ できる(自動的に引き継がれる)

「子プロセス」とは、現在のシェルから呼び出した外部コマンド(grep, python, node)や別シェルスクリプト(./build.sh)、サブシェル(bash -c '...')のことです。export を付けずに代入した変数は子プロセスに渡りません。

子プロセス・孫プロセスへの継承メカニズム(検証実例)

Linuxでは、プロセスが新しい子プロセスを生成(fork/exec)する際、親プロセスの環境変数領域のコピーが子プロセスへ渡されます。

1. 子プロセスへの引き継ぎ実験

# 1) export なし:子プロセスに渡らない
LOCAL_VAR="hello"
bash -c 'echo "CHILD: $LOCAL_VAR"'
# 出力結果: CHILD: (何も表示されない)

# 2) export あり:子プロセスに渡る
export GLOBAL_VAR="world"
bash -c 'echo "CHILD: $GLOBAL_VAR"'
# 出力結果: CHILD: world

2. 孫プロセス(さらに深い子プロセス)への引き継ぎ

環境変数は、直近の子プロセスだけでなく、その子プロセスがさらに起動した「孫プロセス」へも連鎖して引き継がれます。

export APP_STAGE="staging"

# 子プロセスからさらに子プロセス(孫プロセス)を起動
bash -c 'bash -c "echo GRANDCHILD: \$APP_STAGE"'
# 出力結果: GRANDCHILD: staging

【重要な原則:親プロセスへは遡らない】
子プロセス内で環境変数を書き換えたり削除したりしても、親プロセスの変数には一切影響を与えません。子プロセスに渡されるのはあくまで「メモリ上のコピー」であるためです。

基本構文と主要オプション一覧(-p / -n / -f)

export コマンドの基本書式とサポートされているオプションです。

# 基本構文
export [オプション] [変数名[=値]]...
オプション説明実用コマンド例
変数名=値変数の定義と環境変数化を同時に実行export API_KEY="xyz123"
変数名すでに定義されているシェル変数を環境変数へ昇格export MY_DATA
-n 変数名エクスポート属性を解除(シェル変数に戻す。値は保持)export -n API_KEY
-pエクスポートされているすべての環境変数を宣言形式で一覧表示export -p
-f 関数名Bashの定義済み関数をエクスポートして子シェルへ引き継ぐexport -f my_function

export -n(エクスポート属性の解除)の便利な使い方

export -n は、「変数の値そのものは現在のシェルに残したいが、これ以降起動する外部コマンドや子プロセスには渡したくない」という場面で利用します。

export SECRET_TOKEN="top_secret"

# エクスポート属性を解除(変数は残る)
export -n SECRET_TOKEN

# 現在のシェルでは参照できる
echo "$SECRET_TOKEN"   # => top_secret

# 子プロセスからは参照できなくなる
bash -c 'echo "CHILD: $SECRET_TOKEN"'
# 出力結果: CHILD: (空文字)

変数の実体ごと完全に消去したい場合は、後述の unset コマンドを使用してください。

exportの実行パターン(即時・一時・ファイル一括読み込み)

1. 即時設定(最も標準的な書き方)

export APP_PORT=8080
export DB_HOST="db.internal.example.com"

2. 一時指定(コマンド実行時のみ有効化)

現在のシェル環境を汚さず、あるコマンドを実行する1回限り環境変数を渡したい場合は、コマンドの直前に変数を記述します(または env コマンドを使用)。

# この実行の間だけ NODE_ENV=production が渡される
NODE_ENV=production node server.js

# コマンド終了後、現在のシェルには残らない
echo "$NODE_ENV"   # => 空

3. .envファイルからの自動一括エクスポート(set -a)

.env ファイルなどに多数の設定値が並んでいる場合、1行ずつ export を書く代わりに set -a(allexportフラグ)を活用すると、読み込んだ変数が自動的にすべて export されます。

# 自動エクスポートを有効化
set -a
# 設定ファイルを読み込み(自動的にすべて環境変数になる)
source .env
# 自動エクスポートを無効化(安全のため戻す)
set +a

環境変数を確認・検索する4つのコマンド

現在エクスポートされている環境変数は、目的に応じて以下のコマンドで確認できます。

# 1. export -p:再代入可能な宣言形式(declare -x)で一覧出力
export -p

# 2. printenv:環境変数の値のみピンポイント確認(推奨)
printenv PATH
printenv APP_PORT

# 3. env:生の一覧を出力してgrep検索
env | grep -i "node"

# 4. echo:手軽に値を確認(※シェル変数も表示される点に注意)
echo "$PATH"

printenv は指定した変数が環境変数として存在しない場合に終了ステータス 1 を返すため、スクリプト内での存在判定にも適しています。詳しい使い分けは printenvコマンドで環境変数を確認する方法 を参照してください。

実務で役立つexport活用パターン5選

1. PATH環境変数の拡張(独自コマンドの追加)

実務で最も多用されるパターンです。既存の $PATH を維持しつつ、新しいツールの配置先ディレクトリを追加します。

# パスの先頭に追加(標準より優先したい場合)
export PATH="$HOME/.local/bin:$PATH"

# パスの末尾に追加(標準コマンドを優先したい場合)
export PATH="$PATH:/opt/custom_tool/bin"

2. スクリプトの動作モード・デバッグ切り替え

シェルスクリプトのコード本体を修正することなく、環境変数によって処理の振る舞いを動的に変更します。

export DEBUG_MODE=true
./batch_job.sh

3. APIキーやシークレットの安全な受け渡し

機密情報をコードに直接記載せず、環境変数から読み取らせることでセキュリティを確保します。

export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
python generate_report.py

4. Node.js / Pythonなど外部アプリの環境分離

export NODE_ENV="production"
export PORT="3000"
export DATABASE_URL="postgresql://user:pass@localhost:5432/myapp"
node app.js

5. ログ出力レベルの動的制御

通常運用時はエラーのみ、障害調査時だけ詳細ログを出力させる設定を環境変数で制御します。

export LOG_LEVEL="debug"
./run_application.sh

環境変数を削除する(unset vs export -n)

不要になった変数のエクスポート状態を解除・削除する2つのコマンドの違いです。

コマンド変数自体の保持現在のシェルでの参照子プロセスへの継承主な用途
export -n VAR○ 残る○ 参照可能× 渡らない子プロセスへの公開だけを止めたい場合
unset VAR× 消去される× 参照不可(空)× 渡らない変数をメモリ上から完全に削除したい場合

※ ~/.bashrc などの設定ファイルに記述している場合は、設定ファイル内の export 行を削除して保存しないと、次回ログイン時に再び復活します。完全な削除手順は unsetコマンドの使い方 をご覧ください。

よくあるエラー・落とし穴と対処法

症状・エラー主な原因正しい対処法
=: not found や構文エラー= の前後に半角スペースを入れているexport VAR="val" のように = の前後にスペースを入れない
設定したはずの変数が消えたターミナル上でのみ実行し永続化していない~/.bashrc に追記して source ~/.bashrc で反映
スペースを含む値が途中で切れるダブルクォートで値を囲んでいないexport TITLE="Hello World" のようにクォートする
基本コマンド(lsやgrep)が見つからないPATH追加時に $PATH を含めず上書きした/usr/bin/export PATH=/usr/local/bin:/usr/bin:/bin で復旧
export: command not founddash や古い最小シェルで実行しているシバンを #!/usr/bin/env bash に変更する

セキュリティとベストプラクティス

  • 履歴(bash_history)に機密情報を残さない:HISTCONTROL=ignorespace を設定した上で、 export API_KEY="sk-..." のように先頭に半角スペースを入れてコマンドを実行すると、シェルのコマンド履歴に残りません。
  • .envファイルは必ず.gitignoreに登録:パスワードやシークレットを含む環境変数定義ファイルは、誤ってGitリポジトリへコミットしないよう厳重に管理します。
  • PATHの先頭への追加は慎重に:悪意あるスクリプトや同名コマンドによる上書き実行(乗っ取り)を防ぐため、信頼できるパスのみを先頭に配置します。

よくある質問(FAQ)

export と通常の変数代入は何が違うのですか?

通常の変数代入(VAR=value)は現在のシェル内でのみ有効なシェル変数で、外部コマンドや起動したスクリプトには渡されません。export VAR=value とすることで環境変数になり、子プロセスや孫プロセスへ自動的に引き継がれるようになります。

ターミナルを閉じても export の設定を残すにはどうすればいいですか?

ホームディレクトリの ~/.bashrc(対話シェル用)または ~/.bash_profile(ログインシェル用)の末尾に export VAR=value を追記し、source ~/.bashrc で反映させます。

source と export は何が違いますか?

source script.sh は別スクリプトを現在のシェルプロセス自身の中で実行するコマンドです。一方 export は変数を子プロセスへ引き継がせるコマンドです。スクリプト内で定義した変数を親シェルに残したい場合は source で実行します。

export -n と unset の違いは何ですか?

export -n VAR はエクスポート属性だけを解除し、現在のシェル上にはシェル変数として値を残します。unset VAR は変数そのものをメモリ上から完全に削除します。

まとめ・関連リンク

  • export はシェル変数を環境変数に昇格させ、子プロセス・孫プロセスへ継承させるコマンド。
  • エクスポート解除は export -n、完全削除は unset を使い分ける。
  • PATH追加時は必ず export PATH="$PATH:/new/bin" のように既存の $PATH を含める。
  • 恒久的に残すには ~/.bashrc に追記して source ~/.bashrc で反映する。

関連コマンド・関連記事

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント