「変数を設定したのにプログラムから読み込めない」「export コマンドがある場合とない場合で何が違うのかわからない」……そんな悩みを持ったことはないでしょうか。
Bashの 環境変数 と シェル変数 の違いを理解すると、プログラムでの変数読み込みミスが減り、シェルスクリプトをより適切に書けるようになります。本記事では、両者の違いから設定の永続化までを徹底解説します。
目次
- 環境変数とは(シェル変数との違い)
- 用途の違い
- 環境変数への追加方法
- 環境変数の表示方法(一覧・個別)
- エクスポート属性の削除
- 環境変数の永続化と設定ファイル
- まとめ
環境変数とは(シェル変数との違い)
一番の大きな違いは、影響力の 「スコープ(範囲)」 です。
- シェル変数: 「今使っているターミナル(プロセス)」の中だけで有効な変数。
- 環境変数: 「今使っているターミナル」から起動した 「子プロセス(別のプログラム:コマンド、スクリプト、サブシェル等)」 にも引き継がれる変数。
実は、Bashにおいて環境変数は独立した存在ではありません。「エクスポート(export)」という属性フラグを付与されたシェル変数 のことを環境変数と呼びます。
子プロセスに引き継がれる例
以下のようなBashスクリプト my.sh があるとします。
#!/bin/bash
echo "var (シェル変数) は: ${var}"
echo "PATH (環境変数) は: ${PATH}"
このスクリプトを実行すると、エクスポートされていないシェル変数は子プロセス(スクリプト)に引き継がれないため、空欄になります。
# Bash
# シェル変数を定義
var='hoge'
chmod +x my.sh
./my.sh
./my.sh
# --- 出力結果 ---
# var (シェル変数) は:
# PATH (環境変数) は: /usr/local/bin:/usr/bin:...
図解:シェル変数と環境変数の違い

用途の違い
| 種類 | 主な用途 | 命名の慣習 |
| シェル変数 | スクリプト内の一時的なフラグ、ループ用変数など | 小文字 (my_var) |
| 環境変数 | PATH や EDITOR など、あらゆるプログラムに参照させたい設定 | 大文字 (MY_VAR) |
命名を「小文字」と「大文字」で使い分けることで、自分用のメモ変数なのか、システム全体に影響する設定なのかを一目で区別できます。
環境変数への追加方法
シェル変数にエクスポート属性を付与するには、export コマンドを使います。
# Bash
# 1. 定義済みのシェル変数をエクスポートする場合 (注意: $ は不要)
GREETINGS='Hello!'
export GREETINGS
# 2. 新規定義と同時にエクスポートする場合(一般的)
export MY_APP_PORT=8080
一時的な環境変数の利用
特定のコマンドを実行する時だけ環境変数を渡したい場合は、コマンドの直前で定義します。これは環境を汚さないため、非常に便利な手法です。
# Bash
# この実行の間だけ IFS がカンマになる
IFS=, read -ra FRUITS <<< "$DATA"
環境変数の表示(一覧・個別)
環境変数を表示したい場合、用途によって複数コマンドを使い分けます。
printenv: 環境変数のみを表示。特定の変数を指定して表示(printenv PATH)するのに便利。env: 環境変数のみを一覧表示。別の環境でコマンドを実行する際にも使われる。set: シェル変数、環境変数、さらに定義された関数まで全て表示する。(関数を除外したい場合はサブシェルでPOSIXモードに設定する。(set -o posix; set))
エクスポート属性の削除
「変数は残したいが、子プロセスには引き継ぎたくない(環境変数からシェル変数に戻したい)」場合は -n オプションを使います。
# Bash
export -n VAR
エクスポート属性を削除しただけなので、シェル変数として存続し続けます。
# Bash
export VAR='hoge'
printenv VAR # 出力: hoge
export -n VAR
printenv VAR # 出力なし
# エクスポート属性なしのシェル変数として存続
echo $VAR # 出力: hoge
変数自体を削除したい場合はunsetコマンドを使います。
# Bash
unset VAR
echo $VAR # 出力なし
環境変数の永続化と設定ファイル
ターミナルを閉じると変数は消えてしまいます。永続化するには設定ファイル(スタートアップファイル)に記述します。
- 個人設定:
~/.bashrc- 新しいターミナルを開くたびに読み込まれます。
- システム全体:
/etc/profile.d/内の.shファイル- 全ユーザーに適用したい設定に使用します。
# Bash
# 例: ~/.bashrc に追記
export PATH="$HOME/bin:$PATH"
注意)
.bashrcは「対話型シェル」で読み込まれます。スクリプト実行時にも確実に変数を参照させたい場合は、必ずexportを付けて定義してください。
起動されるシェルの種類や読み込む設定ファイルの違いは、「ログイン、対話型シェルの組み合わせとスタートアップファイル」で詳しく解説しています。
まとめ
- 環境変数 は子プロセスに引き継がれる。
- 実体は 「エクスポート属性」がついたシェル変数。
- 操作は
export(追加)、export -n(属性削除)、unset(変数削除)。
これらを使い分けることで、より堅牢で管理しやすい環境を構築できるようになります!
