環境変数
環境変数とは 1 つ以上のアプリケーションによって使用されるデータを含む名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値としては、実行可能ファイルのファイルシステムにおける場所や使用するデフォルトのエディタ、システムロケールの設定などがあります。Linux に慣れてないユーザーは、環境変数で設定をするのは御しがたいと考えがちです。しかし、環境変数は、Linux で複数のアプリケーションとプロセスの間で設定を共有するためのシンプルな方法を提供してくれます。
目次
ユーティリティ
coreutils パッケージには printenv と env というプログラムが入っています。現在設定されている環境変数とその値を表示するには:
$ printenv
env
ユーティリティを使うことで環境変数を変更してコマンドを実行することができます。以下の例では環境変数 EDITOR
を vim
に設定して xterm を起動します。以下のコマンドを実行してもグローバルな環境変数 EDITOR
に影響は与えません。
$ env EDITOR=vim xterm
Bash に組み込まれている set はシェルのオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前や値を表示することができます。詳しくは、set 組み込みドキュメントを参照してください。
各プロセスは環境を /proc/$PID/environ
ファイルに保存します。このファイルには、ヌル文字 (\x0
) で区切られた各キーと値のペアが含まれています。sed を使用するとより読み易い形式で取得できます。例: sed 's:\x0:\n:g' /proc/$PID/environ
.
変数の定義
環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや systemd サービスでは、変数を有効にするために特定の場所に設定することが要求されます。環境変数のスコープは、それらが影響を与えるコンテキストに分解されます。
- グローバル: あらゆるユーザーが実行する全てのプログラム、systemd サービスは含まれません。
- ユーザー別: 特定のユーザーが実行する全てのプログラム。systemd ユーザーサービス (参照 Systemd/ユーザー#環境変数) やグラフィカルアプリケーション (参照 #グラフィック環境) は含まれない。
グローバル
シェルの初期化ファイルの使用
大半の Linux ディストリビューションは、あなたに /etc/profile
等のファイルに環境変数の追加・変更を行うよう指示します。また、/etc/locale.conf
のような変数設定を含むパッケージ固有の設定ファイルがあることも覚えておいてください。環境変数の維持・管理は必ず行い、環境変数を含むことができる多数のファイルに注意を払うようにしてください。原則的にあらゆるシェルスクリプトは環境変数の定義に使われる可能性がありますが、以下のような UNIX の慣例に従い特定のファイルでのみ行われるべきものです。
次のファイルがシステムでグローバルな環境変数の定義に使われますが、それぞれに異なる制限があります。
/etc/environment
- PAM-env モジュールによって使われ、シェルに依存しないため、スクリプトまたはグロブ展開は使用できません。/etc/profile
- ログインシェルのみにおいて変数を初期化します。ただし、スクリプトを実行したり、全ての Bourne shell 互換シェルで使うことができます。- シェル固有の設定ファイル - 使用する シェルのグローバルな設定ファイルで、変数の初期化やスクリプトの実行を行います。例えば Bash#設定ファイル や Zsh#スタートアップ/シャットダウン ファイル などです。
以下の例では、複数のディレクトリ (例えば ~/bin
や ~/scripts
) をそれぞれのユーザーの PATH
に追加する関数を作成することにします。これを行うには、好みのグローバル環境変数設定ファイル (/etc/profile
または /etc/bash.bashrc
) に記述するだけです。
set_path(){ # Check if user id is 1000 or higher [ "$(id -u)" -ge 1000 ] || return for i in "$@"; do # Check if the directory exists [ -d "$i" ] || continue # Check if it is not already in your $PATH. echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue # Then append it to $PATH and export it export PATH="${PATH}:$i" done } set_path ~/bin ~/scripts
pam_env を使う
PAM モジュール pam_env(8) は、環境に設定する変数を以下のファイルから順番に読み込みます。/etc/security/pam_env.conf
, /etc/environment
から変数を読み込みます。
/etc/environment
は、例えば、別々の行にある単純な VARIABLE=value
のペアで構成されていなければなりません。
EDITOR=nano
/etc/security/pam_env.conf
は以下のようなフォーマットで記述します。
VARIABLE [DEFAULT=value] [OVERRIDE=value]
@{HOME}
と @{SHELL}
は、/etc/passwd
で定義されているものに拡張される特別な変数です。次の例は、HOME
環境変数を別の変数に展開する方法を示しています。
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
また、このフォーマットでは、${VARIABLE}
を使って、既に定義されている変数を他の変数の値で展開することができます。
GOPATH DEFAULT=${XDG_DATA_HOME}/go
VARIABLE=value
のペアも可能ですが、これらのペアでは変数の展開はサポートされていません。詳しくは pam_env.conf(5) を参照してください。
ユーザーごと
環境変数をグローバルに定義したくないという時もあるでしょう。例えば、PATH
に /home/my_user/bin
を追加したいが、システム上の他のユーザーには同じ PATH
を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます:
- シェルの設定ファイル、例えば Bash#設定ファイル や Zsh#スタートアップ/シャットダウン ファイル。
- systemd ユーザー環境変数 は
~/.config/environment.d/*.conf
から環境変数が読み込まれます。
ローカルで PATH
にディレクトリを追加したい場合、以下のように ~/.bash_profile
に記述します:
export PATH="${PATH}:/home/my_user/bin"
変数をアップデートするために、再ログインするかファイルを source してください: $ source ~/.bash_profile
。
グラフィック環境
環境変数がグラフィカルなアプリケーションにしか影響しない場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。スコープの降順:
- #Xorg セッションごと および #Wayland セッションごと - DE を含むグラフィカルセッション全体に影響します。
- #デスクトップ環境セッションごと - グラフィカルセッション内で生成されたアプリケーションに影響を与え、DE 自身を含む可能性があります。
- #アプリケーションごと - 特定のグラフィカル アプリケーションだけに影響します。
デスクトップ環境セッションごと
いくつかのグラフィカルな環境 (例えば KDE Plasma) はログイン時にシェルスクリプトを実行することをサポートしており、環境変数の設定に利用することができます。KDE#自動起動 を参照してください。
Xorg セッションごと
Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります。
- ほとんどの ディスプレイマネージャ は xprofile をソースとしています。
- startx と SLiM は xinitrc を実行します。
- XDM は
~/.xsession
を実行します: XDM#セッションの定義 を参照して下さい。
スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です。
~/.xprofile, ~/.xinitrc, or ~/.xsession
... export GUI_VAR=value ...
Wayland セッションごと
Wayland は Xorg 関連のファイルを起動しないので、GDM と KDE Plasma が代わりに systemd/ユーザーの環境変数 をソースとしています。
~/.config/environment.d/envvars.conf
GUI_VAR=value
Wayland セッションをサポートする他のディスプレイマネージャ(SDDM など)ではまだこのサポートを提供していません。
アプリケーションごと
セッション全体ではなく、特定のアプリケーションにのみ環境変数を設定するには、そのアプリケーションの .desktop ファイルを編集してください。その方法は デスクトップエントリ#環境変数の変更 を参照してください。
Steam ゲームでは、起動オプションを編集することでプログラムの環境を設定することができます。Steam#起動オプションを参照してください。
セッションごと
時としてもっと限られた定義が必要になる場面もあります。絶対パスを入力せずに指定したディレクトリから一時的に実行ファイルを起動したい場合や、アプリケーションを実行するために短時間だけ ~/.bash_profile
を編集しなくてはならない場合などです。
その場合、export コマンドを使うことで、現在のセッションのみで PATH
変数を定義することができます。ログアウトするまでは、PATH
変数は一時的な設定が使われます。PATH
に特定のディレクトリを追加するには、次を実行:
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
サンプル
以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。
XDG_CURRENT_DESKTOP
は freedesktop.org の変数で、現在の デスクトップ環境 が [1] として識別する文字列のリストをコロンで区切って格納しています。活発に開発されている環境の標準的な値は、GNOME
,GNOME-Flashback
,KDE
,LXDE
,LXQt
,MATE
,TDE
,Unity
,XFCE
,EDE
,Cinnamon
およびPantheon
です。[2]。- Cinnamon は他のデスクトップ環境より遅れて登録されました。そのため、6.3という最近の Qt バージョンなど、まだ登録前の値
X-CINNAMON
を期待するソフトウェアがあるかもしれません[3]。
- Cinnamon は他のデスクトップ環境より遅れて登録されました。そのため、6.3という最近の Qt バージョンなど、まだ登録前の値
XDG_SESSION_DESKTOP
はXDG_CURRENT_DESKTOP
に似ていますが、1 つの文字列しか許可しません。その名前にもかかわらず、これは freedesktop.org によって標準化されていません。
DE
は使用中の desktop environment を示すレガシー変数です。どのような値が可能かについての中心的なドキュメントはありませんが、xdg-utils は多くのデスクトップ環境についてのリファレンスを提供しています。
DESKTOP_SESSION
はDE
と似ていますが、LXDE デスクトップ環境で使われています:DESKTOP_SESSION
がLXDE
に設定されている場合、xdg-open は pcmanfm のファイル関連付けを使います。
WINDOW_MANAGER
は、デスクトップ環境で使用する ウィンドウマネージャ を「選択」するために時々使われる変数で、他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。
PATH
はコロンで区切られたディレクトリのリストで、システムが実行ファイルを探す対象となります。通常のコマンド (ls, pacman, systemctl など) をシェル(bash や zsh など)に打ち込むと、このリストにあるディレクトリから同じ名前の実行ファイルが探され、そして実行されます。PATH
に含まれないディレクトリ下のものを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、./a.out
や/bin/ls
です。
HOME
は現在のユーザーのホームディレクトリが入ります。この変数は、アプリケーションが現在のユーザーに関連した設定ファイル等を見つけるために使われます。
PWD
には ワーキングディレクトリのパスが入ります。
OLDPWD
には前のワーキングディレクトリのパスが入ります。つまり最後に cd を実行する前のPWD
です。
TERM
には実行中のターミナルの名前が入ります。例:xterm
。
MAIL
には受信したメールの保存場所が入ります。一般的な設定は/var/spool/mail/$LOGNAME
です。
ftp_proxy
とhttp_proxy
にはそれぞれ FTP と HTTP プロキシサーバーを記述します:
ftp_proxy="ftp://192.168.0.1:21" http_proxy="http://192.168.0.1:80"
MANPATH
には man が man ページを探すときに使うコロン区切りのディレクトリのリストが入ります。
INFODIR
には info コマンドが info ページを探す際に使うコロン区切りのディレクトリのリストが入ります。例:/usr/share/info:/usr/local/share/info
。
TZ
はユーザー別にシステムと違うタイムゾーンを指定するために使うことができます。/usr/share/zoneinfo/
に記載されているタイムゾーンを参考にしてください。 例:TZ="/usr/share/zoneinfo/Pacific/Fiji"
。変数TZ
に zoneinfo ファイルを指定する場合、GNU マニュアル に従ってコロンで始める必要があります。
デフォルトプログラム
SHELL
にはユーザーの優先シェルへのパスが含まれます。Bash は起動時にこの変数を設定しますが、これは必ずしも現在実行中のシェルではないことに注意してください。この変数に値がない場合、Bashは自動的に/etc/passwd
で定義されているユーザーのログインシェルに設定するか、判断できない場合は/bin/sh
にします。
PAGER
にはファイルの内容を一覧表示するために使用されるプログラムを実行するコマンドが含まれます。例:/bin/less
。
EDITOR
にはファイルの編集に使用される軽量プログラムを実行するコマンドが含まれています(例:/usr/bin/nano
など)。例えば、この例のように、X の下の geditと nano を対話的に切り替えるように書くことができます。
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
BROWSER
はウェブブラウザのパスが含まれています。X などのグラフィック環境に応じて動的に変更できるように、対話型のシェル設定ファイルに書いておくと便利です。
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links