ENVIRON(5)

名前
environ - ユーザ環境

書式
#include <unistd.h>
extern char **environ;

説明
変数 environ は「環境 (environment)」と呼ばれる文字列配列へのポインタである (この変数はユーザープログラムで宣言しなければならない。 ただし libc4 や libc5 のヘッダーファイルなら unistd.h で宣言されているし、これが glibc 由来のものでも _GNU_SOURCE が define されていれば宣言済みとなる)。 この文字列配列は、 プロセスを起動する exec(2) によって利用できるようになる。 通例では、これらの文字列は `name=value' という書式を とる。よく用いられる例を以下に示す:

USER
    ユーザのログイン名 (BSD 起源のプログラムなどによって使用される)。

LOGNAME
    ユーザのログイン名(System V 起源のプログラムなどによって使用される)。

HOME
    ユーザのログインディレクトリ。 login(1) がパスワードファイル passwd(5) から取得して 設定する。

LANG
    ロケールの各カテゴリで使用されるロケールの名前。 LC_ALL や、より 下層の環境変数によって上書きされることもある。

PATH
    sh(1) や他のプログラムが、フルパスで与えられなかった 実行ファイルを検索するときに、ファイル名に前置されるディレクトリの配列。 各ディレクトリは `:' によって区切られる。 (同じようなものに、シェルがディレクトリ変更コマンドの変更先を探すため に用いる CDPATH、 man(1) がマニュアルページの検索に用いる MANPATH などがある。)

PWD 現在のワーキングディレクトリ。いくつかのシェルが設定する。

SHELL
    ユーザのログインシェルのファイル名。

TERM
    端末の種類。出力はこれにあわせて用意される。

環境に名前を追加する場合には、 sh(1) では exportコマンドと`name=value'を使用する。 csh(1) では setenv コマンドを使用する。 exec(2)の引数としても環境を設定することができる。 C プログラムからは、 getenv(3), putenv(3), setenv(3) and unsetenv(3) などの関数を用いて環境を扱うことができる。 プログラムやライブラリルーチンの多くは、それぞれ適当な環境変数の存在 や値によって、動作に影響を受けることがある。以下、適宜挙げてみよう。

LANG, LANGUAGE, NLPATH, LOCPATH, LC_ALL, LC_MESSAGE などの変数。 ロケールの扱いに影響する。

TMPDIR は tmpnam(3) や他のルーチンによって作成されるファイル名に 前置されるパスに影響する。また sort(1) の一時ディレクトリに用いられたり、他のプログラムからも利用される。

LD_LIBRARY_PATH, LD_PRELOAD などの LD_* 変数はダイナミックローダ・リン カの動作に影響する。

POSIXLY_CORRECT が指定されると、ある種のプログラムやライブラリルーチン は POSIX の規定に従うようになる。

malloc(3) の動作は MALLOC_* 変数によって影響される。

HOSTALIAS 変数は、 gethostbyname(3) が用いるエイリアスが書かれているファイルの名前を与える。

TZ と TZDIR はタイムゾーンの情報を与える。

TERMCAP は、現在の端末情報の取得先 (あるいはそのような情報が書かれてい るファイル名) を与える。

などなど... これらの中には、明らかにセキュリティ上の危険が存在する。ユーザーが IFS や LD_LIBRARY_PATH に異常な値を与えることで、これまで多くのシステムコ マンドがだまされてひどい目にあってきた。

関連項目
login(1), sh(1), bash(1), csh(1), tcsh(1), exec(2), getenv(3), putenv(3), setenv(3), unsetenv(3)