環境変数は、シェルやプログラムが参照できる「名前付きの値」です。 パスの設定、言語ロケール、APIキーの管理など、Linuxを使いこなすうえで欠かせない仕組みです。
環境変数とは
環境変数はシェルセッション全体で共有される変数で、子プロセスにも引き継がれます。 対して、シェル変数はそのシェルの中だけで有効です。
# シェル変数(子プロセスには引き継がれない)
MY_VAR="hello"
# 環境変数(export で子プロセスにも引き継がれる)
export MY_VAR="hello"
環境変数を参照する
変数の値を参照するには $変数名 または ${変数名} を使います。
echo $HOME
echo $USER
echo ${PATH}
よく使われる組み込みの環境変数には次のものがあります。
| 変数名 | 内容 |
|---|---|
HOME | ホームディレクトリのパス |
USER | ログイン中のユーザー名 |
PATH | コマンドの検索パス(:区切り) |
SHELL | 使用中のシェル |
LANG | 言語・ロケール設定 |
PWD | 現在のディレクトリ |
環境変数の一覧を確認する
現在のシェルで設定されているすべての環境変数を見るには env または printenv を使います。
# すべての環境変数を表示
env
# 特定の変数だけ表示
printenv HOME
printenv PATH
set コマンドはシェル変数も含めて表示するため、env より多くの変数が出力されます。
環境変数を設定する
セッション内での設定
export DATABASE_URL="postgres://localhost/mydb"
export DEBUG=true
export をつけると、そのシェルから起動した子プロセス(スクリプトなど)にも変数が渡されます。
一時的にコマンドに渡す
コマンドの直前に変数を書くと、そのコマンドだけに環境変数を渡せます。 グローバルな設定を変えずに試したいときに便利です。
LANG=C ls --help # 英語で出力
DEBUG=1 ./my-script.sh
環境変数を削除する
unset コマンドで変数を削除します。
export TEMP_TOKEN="abc123"
echo $TEMP_TOKEN # abc123
unset TEMP_TOKEN
echo $TEMP_TOKEN # (何も出力されない)
設定を永続化する
セッションをまたいで変数を保持したい場合は、シェルの設定ファイルに追記します。
# ~/.bashrc(bash の場合)に追記
echo 'export MY_TOOL_HOME="/opt/my-tool"' >> ~/.bashrc
echo 'export PATH="$MY_TOOL_HOME/bin:$PATH"' >> ~/.bashrc
# 変更を現在のシェルに反映
source ~/.bashrc
~/.profile はログイン時に読み込まれ、~/.bashrc はインタラクティブシェル起動時に読み込まれます。
PATH を追加する
新しいディレクトリをコマンド検索パスに追加するには、PATH に追記します。
# 既存の PATH の先頭にディレクトリを追加
export PATH="/home/user/bin:$PATH"
# 確認
echo $PATH
先頭に追加した場合、同名のコマンドが既存のパスにあっても、追加したパスのものが優先されます。
変数の展開テクニック
# デフォルト値を指定する(変数が未定義または空のとき "default" を使う)
echo ${MY_VAR:-"default"}
# 変数が未定義のときだけデフォルト値を設定する
: ${MY_VAR:="default"}
echo $MY_VAR # default
# 変数が定義されているときだけ別の値を使う
echo ${MY_VAR:+"defined!"}
練習問題
問題1
GREETING という環境変数に "こんにちは" を設定し、echo で表示してください。
問題2
現在設定されている環境変数の中から PATH だけを表示するコマンドを書いてください(2通り以上)。
問題3
次のコマンドを実行したとき、何が表示されるか答えてください。
export NAME="Alice"
bash -c 'echo $NAME'
問題4
/home/user/scripts をコマンドの検索パスに追加し、現在のセッションで有効にしてください。
問題5
SECRET_KEY という環境変数を設定したあと、その変数を削除し、空になったことを確認してください。
答え
問題1の答え
export GREETING="こんにちは"
echo $GREETING
問題2の答え
# printenv を使う
printenv PATH
# echo を使う
echo $PATH
# env から grep で絞り込む
env | grep ^PATH=
問題3の答え
Alice
export で設定した変数は子プロセス(bash -c ... で起動したサブシェル)にも引き継がれるため、Alice が表示されます。export なしで NAME="Alice" とした場合は空行が表示されます。
問題4の答え
export PATH="/home/user/scripts:$PATH"
# 確認
echo $PATH
問題5の答え
export SECRET_KEY="mysecret"
echo $SECRET_KEY # mysecret
unset SECRET_KEY
echo $SECRET_KEY # (何も表示されない)
echo "変数の値: '${SECRET_KEY}'" # 変数の値: ''