ハンドブック:X86/ワーキング/環境変数
環境変数
はじめに
環境変数とは、1つまたは複数のアプリケーションで使われる情報を格納する名前付きオブジェクトです。環境変数を使用することで1つまたは複数のアプリケーションの設定を簡単に変更できます。
重要な例
以下の表は Linux システムで使われる数多くの変数を列挙し、使用方法の説明を加えたものです。値の例は表の後にあります。
変数 | 説明 |
---|---|
PATH | この変数は、システムが実行可能ファイルを探索するディレクトリーのコロン区切りのリストを含みます。ある実行可能ファイルの名前 (ls、rc-update、あるいは emerge など) が入力されても、この実行可能ファイルがリストに含まれるディレクトリー内にない場合には (/bin/ls のようにフルパスがコマンドとして入力されない限り) システムはそれを実行しません。 |
ROOTPATH | この変数は PATH と同様の機能を持っていますが、こちらは root ユーザーがコマンドを入力した時にチェックされるディレクトリーのみが列挙されています。 |
LDPATH | この変数は動的リンカがライブラリを探すときに検索するディレクトリーのコロン区切りのリストを含みます。 |
MANPATH | この変数は man(1) コマンドが man ページを検索するディレクトリーのコロン区切りのリストを含みます。 |
INFODIR | この変数は info(1) コマンドが info ページを検索するディレクトリーのコロン区切りのリストを含みます。 |
PAGER | この変数は (less や more(1) のような) ファイル内容を表示するのに使用されるプログラムへのパスを含みます。 |
EDITOR | この変数は (nano や vi のような) ファイルを編集するのに使用されるプログラムへのパスを含みます。 |
KDEDIRS | この変数は KDE 特有の素材を含むディレクトリーのコロン区切りのリストを含みます。 |
CONFIG_PROTECT | この変数はパッケージアップデートの間 Portage によってプロテクトされるディレクトリーのスペース区切りのリストを含みます。 |
CONFIG_PROTECT_MASK | この変数はパッケージアップデートの間 Portage によってプロテクトされるべきでないディレクトリーのスペース区切りのリストを含みます。 |
以下はこれらの変数すべての定義例です:
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
# パッケージ更新中に保護されるディレクトリ。
# 以下の各行の最後の \ (バックスラッシュ) によって、スペース区切りの単一行として解釈されます。
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
/usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
/usr/share/texmf/tex/platex/config/ /usr/share/config"
# パッケージ更新中に保護され _ない_ ディレクトリ。
CONFIG_PROTECT_MASK="/etc/gconf"
変数を全体に設定する
env.d ディレクトリー
これらの変数の定義を集約するため、Gentoo では /etc/env.d/ ディレクトリーが導入されています。このディレクトリーの中には 50baselayout や gcc/config-x86_64-pc-linux-gnu といった数多くのファイルがあり、そこにはファイル名が表すアプリケーションで必要とされる変数が含まれています。
たとえば gcc がインストールされると、ebuild によって以下の変数の定義を含む gcc/config-x86_64-pc-linux-gnu という名前のファイルが作成されます:
GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/13"
LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/13:/usr/lib/gcc/x86_64-pc-linux-gnu/13/32"
MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/13/man"
INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/13/info"
STDCXX_INCDIR="g++-v13"
CTARGET="x86_64-pc-linux-gnu"
GCC_SPECS=""
MULTIOSDIRS="../lib64:../lib"
他のディストリビューションでは、システム管理者はこうした環境変数の定義を /etc/profile やその他の場所で変更または追加するよう指示されるでしょう。一方 Gentoo ではシステム管理者 (と Portage) は環境変数を含む可能性がある多数のファイルに注意を払うことなく環境変数を維持管理できます。
たとえば gcc が更新された場合、/etc/env.d/gcc の下にある関連するファイルも管理者の関与を一切求めずに更新することができます。
それでもまだ、システム管理者にはある環境変数をシステム全体でセットするよう求められる場合があるでしょう。一例として http_proxy 変数を取り上げてみましょう。/etc/profile ディレクトリの下のファイルを編集するのではなく、/etc/env.d/99local という名前のファイルを作成してそこに定義を入れてください:
http_proxy="proxy.server.com:8080"
カスタマイズされるすべての環境変数について同じファイルを使うことで、システム管理者は自身が定義した変数を素早く見ることができます。
env-update
/etc/env.d/ ディレクトリ内のいくつかのファイルは PATH 変数に定義を追加しています。これは間違いではありません: env-update コマンドは実行されると、いくつかの定義を結合してそれぞれの環境変数をアトミックに更新します。これによって、パッケージ (やシステム管理者) が自身の環境変数の設定をすでに存在する値と干渉しないように追加するのが簡単になります。
env-update スクリプトは値を /etc/env.d/ にあるファイルのアルファベット順で結合します。ファイル名は2桁の10進数で始めないといけません。
09sandbox 50baselayout 51dconf
+------------+----------------+-----------+
CONFIG_PROTECT_MASK="/etc/sandbox.d /etc/gentoo-release /etc/dconf ..."
変数の結合は常に起こるわけではなく、以下の変数でのみ行われます: ADA_INCLUDE_PATH、ADA_OBJECTS_PATH、CLASSPATH、KDEDIRS、PATH、LDPATH、MANPATH、INFODIR、INFOPATH、ROOTPATH、CONFIG_PROTECT、CONFIG_PROTECT_MASK、PRELINK_PATH、PRELINK_PATH_MASK、PKG_CONFIG_PATH、そして PYTHONPATH。それ以外のすべての変数では (/etc/env.d/ のファイルのアルファベット順で) 最後に定義された値が使われます。
変数名を COLON_SEPARATED または SPACE_SEPARATED 変数のどちらかに(これまた /etc/env.d/ 内のファイルで)追加することで、この結合される変数のリストにさらなる変数を追加することができます。
env-update を実行すると、スクリプトはすべての環境変数を作成してそれを /etc/profile.env (これは /etc/profile によって使用されます) に格納します。また LDPATH 変数から情報を展開して /etc/ld.so.conf を作成します。その後スクリプトは ldconfig を実行して、動的リンカが使用する /etc/ld.so.cache を再作成します。
env-update の効果を実行後すぐに有効にするには、以下のコマンドを実行して環境を更新してください。Gentoo を自分自身でインストールしたユーザーは、おそらくインストールの説明でこれを見たことを思い出すかもしれませんね:
root #
env-update && source /etc/profile
上のコマンドは現在の端末、新しいコンソールおよびそれらの子孫での変数のみを更新します。したがって、ユーザーが X11 で作業している場合、新しく開いた端末すべてで source /etc/profile と打ち込むかあるいは X を再起動して、すべての新しい端末が新しい変数を読み込むようにする必要があります。ログインマネージャーを使用している場合は root になって /etc/init.d/xdm サービスを再起動する必要があります。
シェル変数を他の変数の定義に使用することはできません。つまり、
FOO="$BAR"
($BAR はもう一つの変数) といったことは禁止されているということです。変数を局所的に設定する
ユーザーごと
環境変数を全体に設定する必要はないこともあります。たとえば、あるユーザーは /home/my_user/bin と作業ディレクトリ (ユーザーが今いるディレクトリ) を PATH 変数に追加したいが、これらのディレクトリをシステム上の他のすべてのユーザーの PATH には含めたくない場合などです。環境変数を局所的に定義するには、~/.bashrc (すべての対話的シェルセッションに対して) または ~/.bash_profile (ログインシェルセッションに対して) を使用します:
# 後ろにディレクトリーが続かないコロンは現在の作業ディレクトリーとして扱われます
PATH="${PATH}:/home/my_user/bin:"
ログアウト/ログインすると PATH 変数が更新されます。
セッションごと
時には、さらに厳格な定義が求められる場合もあります。たとえば、一時ディレクトリーにあるバイナリーを、それらへのフルパスを使用する必要なく、また一時的に ~/.bashrc を編集するも必要なく、使用できるようにしたい場合です。
この場合、現在のプロファイルでの PATH 変数を単に export コマンドを使って定義します。ユーザーがログアウトするまでの間は PATH 変数にその一時的な設定が使われます。
root #
export PATH="${PATH}:/home/my_user/tmp/usr/bin"