はうすてんぼぶ

コードかいてて疑問に思ったことや、興味あることをつらつらと暇なときに書く場所、ここはそんな場所

環境変数

環境変数の勉強をば。

自分は今現在PATHぐらいしか知らないし、おそらく過去にそれ以上の環境変数をいじった記憶は…無い。

せめて、どの項目が何を指しているのかぐらい覚えておきたいので、大事そうな奴だけここでまとめておく。

環境変数を見る方法

setprintenvで見ることができる。

ただし、setコマンドの場合は、シェル変数も含まれるので環境変数だけ見たい場合にはprintenvで見ることを推奨。

% printenv | sort
COLORTERM=gnome-terminal
COMPIZ_CONFIG_PROFILE=ubuntu
〜〜〜 省略 〜〜〜

順番を指定するオプションは無いので、行単位で出力してくれるsortコマンドにパイプで渡すと見やすくて良い。

特定の環境変数だけ見たい場合は、引数に指定すると見ることができる。

% printenv HOME USER
/home/bob
bob

またはechoコマンドを使っても見ることができる。
それぞれの環境変数は「$環境変数名」で参照できる。

% echo "HOME: $HOME\nUSER: $USER"
HOME: /home/bob
USER: bob

設定方法

exportコマンドは、シェル変数を環境変数に昇格させることができる。
シェル変数だけだと、子プロセスで値を参照することはできないが、
それを環境変数にすることで、そのシェルで実行される子プロセスは全てその変数を参照することが可能になる。

ちなみにシェルを閉じるとそのexportで設定した環境変数も破棄される。

設定してみた例を以下に示す。

% TEST=123
% echo $TEST
123

% zsh (新しくzshを起動)
% echo $TEST
()
%exit (子プロセスのzshを閉じる)

% export TEST
% printenv TEST
123

% zsh (新しくzshを起動)
% ecoh $TEST
123

環境変数の中身

じゃあ実際にそれぞれの環境変数が何を担っているのかを書いていく。

PATH

プログラムの置いてあるディレクトリ名の指定。

頭から順に該当するプログラムが置いてあるかどうか調べていくので、
もし同名のプログラムが複数ある場合には、その順序に気を付ける必要がある。
もしPATHの中で同名のプログラムが複数ある場合には、whereコマンドで調べることができる。

% where test
/usr/bin/test
/usr/local/bin/test

HOME

ホームディレクトリ。

シェルが起動したときのカレントディレクトリであり、
引数なしでcdしたときに移動するディレクトリ。

LANG

使用言語の指定。

C
ja
japanese
ja_JP.EUC
ja_JP.JIS
ja_JP.SJIS
ja_JP.PCK 

などがある。

自分のUbuntuの環境ではja_JP.UTF_8だった。

LANGUAGE

GNU独自の環境変数で、複数の言語を:で繋いで指定できる。

非標準のものらしく、「第一希望:第二希望」のように記述する。

% printenv LANGUAGE
ja:en

となっていたので、第一希望を日本語、第二希望を英語としている様子。

SHELL

現在使用しているシェルをフルパス表記したもの。

% printenv SHELL
/bin/zsh

PWD

カレントディレクトリ名

cdで移動するたびに書き換わる。

EDITOR

標準エディタの指定。

自分の環境で指定されてなかったのでvimを設定しておいた。

% export EDITOR=/usr/bin/vim

こうすると、それまでcrontab -eを実行ときはviがエディタとして起動していたが、vimで起動するようになった。
ただ、シェルを閉じるとこの環境変数も消えるので、.zshrcに書いておくことで対応した。

終わりに

とりあえず環境変数の見方、設定方法と、代表的な環境変数に付いて触れた。

自分の環境でprintenvで見る限り、まだまだ全然あるのが恐ろしい。

manコマンドのように環境変数のマニュアルというものを見ることはできないものか…。

参考資料

環境変数マニュアル, http://x68000.q-e-d.net/~68user/unix/environment.html.
さんすけ unix 参考書(UNIX その他/2 環境変数), http://www5b.biglobe.ne.jp/~sgi/unix/unixA/ux502.html.
IPA ISEC セキュア・プログラミング講座:C/C++言語編 第8章 入力検査:環境変数の検査とリセッ, http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c703.html.