環境変数

環境変数はOSが提供するデータ共有機能の一つ。OS上で動作するプロセスがデータを共有するための仕組み。プロセスに対して外部からデータを与え、プロセスの挙動・設定を変更する際に用いる。環境変数には、システムにより定義されるものとユーザが任意に定義するものがある。慣例として環境変数名には大文字を使う (シェル変数には小文字を使う)。

設定されている環境変数の表示

printenvコマンドを使用する。

# printenv
TERM=xterm
SHELL=/usr/local/bin/bash
USER=root
SUDO_USER=woody
SUDO_UID=1001
PACKAGEROOT=ftp://ftp6.jp.freebsd.org
USERNAME=root
PAGER=jless
FTP_PASSIVE_MODE=TRUE
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/woody/bin
MAIL=/var/mail/woody
PWD=/usr/home/woody
SHLVL=1
SUDO_COMMAND=/usr/bin/su
HOME=/root
LOGNAME=root
LC_CTYPE=ja_JP.eucJP
SUDO_GID=1001
_=/usr/bin/printenv

特定の環境変数の値のみ表示するには、printenvコマンドの引数に環境変数名を指定する。

# printenv HOME
/home/woody

環境変数の設定

環境変数を設定する方法はシェルにより異なる。
shの場合

$ VAR=value
$ export VAR

cshの場合

% setenv VAR value

bashの場合

$ export VAR=value

環境変数の削除

# unset VAR
# printenv VAR
(削除されたため表示されない)

コマンドラインシェルスクリプトから環境変数を参照、

「$環境変数名」とします。

% echo $HOME
/home/woody

環境変数の影響範囲

環境変数の値は自分のログインセッション全体に適用される。つまり環境変数はシェル変数と違って子プロセスに引き継がれる。自分が実行する特定のプログラムからも参照できる。ただし、子プロセスが設定した環境変数は親プロセスには影響を与えないし、全く無関係のプロセス(親子の関係にないプロセス)にも反映されない。

# export VAR=aaa         // 環境変数VARの値にaaaを設定
# printenv VAR           // 環境変数VARの値を表示
VAR=aaa                  // 設定した値aaaが表示された
# bash                   // 新しいシェルを起動して子プロセスを作成
# printenv VAR           // 子プロセスの環境変数VARの値を表示
VAR=aaa                  // 親プロセスの環境変数は子プロセスに引き継がれるため値aaaが表示
# export VAR=bbb         // 子プロセスの環境変数VARの値にbbbを設定
# printenv VAR           // 子プロセスの環境変数VARの値を表示
VAR=bbb                  // 設定した値bbbが表示された
# exit                   // 子プロセスの終了。親プロセスのシェルに戻る。
exit
# printenv VAR           // 環境変数VARの値を表示
VAR=aaa                  // 子プロセス作成前に設定した値aaaが表示された。
                         // 子プロセスで設定した値bbbが親プロセスには影響していない

主な環境変数

  • HOME: ホームディレクトリの絶対パス。(例: /home/woody) 引数なしでcdを実行したときに移動するディレクトリ。
  • USER: 自分のログイン名。(例: woody)
  • SHELL: 現在使用しているシェルの絶対パス。(例: /usr/local/bin/bash)
  • PATH: 入力されたコマンドの実行ファイルを検索する場所。(例: /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/woody/bin)
  • PWD: カレントディレクトリ名。(例: /home/woody/test)
  • TERM: 端末 (ターミナル) の種類。(例: xterm) 端末には文字を表示するだけでなく、1文字戻ったり、1行削除したり、画面をクリアするなどの機能がある。これらはそれぞれ特殊なコードが割り当てられており、これをエスケープシーケンスと呼ぶ。viやemacs等では、1文字戻ったり画面をクリアする際、このエスケープシーケンスを出力している。しかしエスケープシーケンスは端末の種類によって違うので、ユーザが今どの種類の端末を利用しているのか環境変数TERMを参照して調べている。そのため、環境変数TERMが設定されていない状態ではviやemacsは正常に動作しない。
  • PAGER: 標準ページャ。(例: more) manなどを実行したとき、環境変数PAGERに設定されているプログラムがページャとして実行される。
  • EDITOR: 標準エディタ。(例: vi) あるプログラムで自動的にエディタを起動してユーザにファイルの編集をさせるような場合に、環境変数EDITORに設定されているプログラムがエディタとして起動する。vipw、crontab、cvs、less などが参照する。
  • LANG: 使用言語の指定。ロケールとも言う。(例: a_JP.eucJP)

ロケールを日本語に設定した場合のdateコマンドの表示の変化。

# date                                  // 普通にdateコマンドを実行すると
Tue Aug 18 11:38:15 JST 2009            // 英語で現在日時が表示される 
# export LANG=ja_JP.eucJP               // 環境変数LANGに日本語を設定してから
# date                                  // dateコマンドを実行すると
2009年 8月18日 火曜日 11時38分32秒 JST  // 日本語で現在日時が表示される