スタートアップCTOによるITエンジニアのためのブログ

Bashのシェル変数と環境変数の違い

「変数を設定したのにプログラムから読み込めない」「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)
環境変数PATHEDITOR など、あらゆるプログラムに参照させたい設定大文字 (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(変数削除)。

これらを使い分けることで、より堅牢で管理しやすい環境を構築できるようになります!