環境変数
環境変数は、1つ以上のアプリケーションによって使用されるデータを含む名前付きのオブジェクトです。簡単に言えば、名前と値を持つ変数です。環境変数の値には、例えばファイルシステム内のすべての実行可能ファイルの場所、使用すべきデフォルトのエディタ、またはシステムロケールの設定などが含まれます。Linux に不慣れなユーザーは、このような設定の管理方法を少し扱いづらいと感じることがよくあります。しかし、環境変数は、複数のアプリケーションやプロセス間で設定を共有する簡単な方法を提供します。
ユーティリティ
coreutils パッケージには printenv(1) と env(1) というプログラムが含まれています。現在の環境変数とその値を一覧表示するには:
$ printenv
printenv の出力を非特権ユーザの場合と root ユーザの場合で比較して確認してみましょう。env ユーティリティを使うことで、環境変数を変更してコマンドを実行することができます。以下の例では、環境変数 EDITOR を vim に設定して xterm を起動します。以下のコマンドを実行しても、グローバルな EDITOR 変数には影響を与えません。
$ env EDITOR=vim xterm
シェル の set(1p) 組み込みコマンドを使えば、シェルオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前とその値を出力したりできます。
各プロセスはその環境変数を /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は、ログインシェルのみに対して変数を初期化します。しかし、このファイルはスクリプト (例:/etc/profile.d/内にあるファイル) を実行し、すべての Bourne shell 互換シェルで使用することができます。- シェル固有の設定ファイル - シェルのグローバルな設定ファイルで、変数の初期化やスクリプトの実行を行います。例えば Bash#設定ファイル (例:
~/.bashrc)) や Zsh#スタートアップ/シャットダウン ファイル (例:~/.zshrc) です。
以下の Bash ヘルパ関数を使えば、複数のディレクトリを PATH 環境変数に末尾追加することができます。環境変数を定義しているファイル (~/.bashrc など) の戦闘にこの関数を追加してください。この関数は、ファイルシステム上に実際に存在するディレクトリのみを追加し、重複するエントリは作成しません。
add_paths() {
for d in "$@"; do
[[ -d "$d" && ! "$PATH" =~ (^|:)$d(:|$) ]] && PATH="$PATH:$d"
done
}
add_paths ~/bin ~/scripts
ほとんどのシェル (Bash、Zsh、fish を含む) では、export コマンドを使って環境に変数を追加することができます。これにより、~/my-environment.sh などのように通常のファイルで環境変数を定義することができます:
~/my-environment.sh
export EDITOR=vim export XDG_CACHE_HOME="$HOME/.cache" export XDG_CONFIG_HOME="$HOME/.config" export XDG_DATA_HOME="$HOME/.local/share" export XDG_STATE_HOME="$HOME/.local/state"
このファイルは、シェルのスタートアップファイルから source することができます:
~/.bashrc
source ~/my-environment.sh
~/.config/fish/config.fish
source ~/my-environment.sh
pam_env を使う
pam_env(8) PAM モジュールは、環境変数の設定を以下のファイルから順番にロードします: /etc/security/pam_env.conf と /etc/environment の順です。
- これらのファイルは、他のファイル、特に、
~/.profile、~/.bash_profile、~/.zshenvより前に読み込まれます。 - 非推奨の
~/.pam_environmentはもう読み込まれません。FS#68945 を参照してください。
/etc/environment では、変数=値 というペアを1行に1つずつ記述しなければなりません。例:
/etc/environment
EDITOR=nano
/etc/security/pam_env.conf は以下の形式で記述します:
/etc/security/pam_env.conf
VARIABLE [DEFAULT=value] [OVERRIDE=value]
@{HOME} と @{SHELL} は、/etc/passwd で定義されているものに拡張される特別な変数です。次の例は、HOME 環境変数を別の変数に展開する方法を示しています:
/etc/security/pam_env.conf
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
${HOME} および ${SHELL} は、HOME および SHELL 環境変数にはリンクされていません。これらはデフォルトでは設定されていません。また、この形式では、${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
~/.bashrc などのような場所で設定された環境変数を継承しません。これはつまり、dbus によってアクティブ化されたプログラム (GNOME Files など) は、そのような変数をデフォルトで使用しないことを意味します。Systemd/ユーザー#環境変数 を参照してください。export -p を実行することで、ユーザセッションに対して宣言されたグローバルな環境変数とローカルな環境変数を見ることができます。グラフィック環境
環境変数がグラフィカルなアプリケーションにしか影響しない場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。スコープを大きい順に並べると:
- #Xorg セッションごと および #Wayland セッションごと - DE を含むグラフィカルセッション全体に影響します。
- #デスクトップ環境セッションごと - グラフィカルセッション内で生成されたアプリケーションに影響を与えます。DE 自体にも影響を与える可能性があります。
- #アプリケーションごと - 特定のグラフィカル アプリケーションだけに影響します。
デスクトップ環境セッションごと
一部のグラフィカル環境 (例えば KDE Plasma) は、ログイン時のシェルスクリプト実行をサポートしており、環境変数の設定に利用することができます。例としては KDE#自動起動 を参照してください。
Xorg セッションごと
Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります:
- ほとんどのディスプレイマネージャは xprofile を読み込みます。
- startx と SLiM は xinitrc を実行します。
- XDM は
~/.xsessionを実行します: XDM#セッションの定義 を参照して下さい。 - LightDM[1]、Plasma Login Manager[2]、SDDM[3] は、ログイン シェルのスタートアップ スクリプトも読み込みます。例えば、bash の場合は
~/.bash_profile、zsh の場合は~/.zprofileおよび~/.zloginです。
スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です:
~/.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) は、まだこれを直接はサポートしていません。しかし、LightDM、Plasma Login Manager、SDDM はログインシェルのスタートアップスクリプトを Wayland セッションでも読み込みます。
greetd も /etc/profile および ~/.profile を読み込みます。この動作は、デフォルトで有効になっている source_profile 設定によって制御されます。
~/.bash_profile などのスタートアップスクリプトを読み込むディスプレイマネージャを使用していて、environment.d を使用したい場合、以下のように読み込むことができます:
~/.bash_profile
# systemd-environment-d-generator(8) を使用して環境を生成し、その変数をエクスポートする set -o allexport source <(/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator) set +o allexport
/usr/lib/systemd/user-environment-generators にある他のジェネレーター、例えば 60-flatpak は環境変数の値を引用符で囲まない場合があります。この場合、出力は export -- "$(/usr/lib/systemd/user-environment-generators/60-flatpak)" を使用して読み込む必要があります。アプリケーションごと
セッション全体ではなく、特定のアプリケーションにのみ環境変数を設定するには、そのアプリケーションの .desktop ファイルを編集してください。その方法は デスクトップエントリ#環境変数の変更 を参照してください。
Steam ゲームでは、起動オプションを編集することでプログラムの環境を設定することができます。Steam#起動オプション を参照してください。
セッションまたはシェルごと
時として、一時的な変数のみが必要である場合もあります。特定のディレクトリ内の実行ファイルを実行する際に一時的に絶対パスを入力する手間を省きたい場合や、一時的な短いシェルスクリプトでそのパスを使用したい場合があるでしょう。
例えば、セッション固有のディレクトリを PATH に追加するには:
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
シェル固有のディレクトリのみを PATH に追加するには:
$ PATH="${PATH}:/home/my_user/tmp/usr/bin"
Bash では、PATH は既にデフォルトで export されているので、上記のどちらの方法を用いても、変数を上書きしない限り、変数の変更がサブプロセスから見えてしまいます。export された変数とされていない変数の違いをよりわかりやすく比較するには、以下を実行してみてください:
$ MYVAR="shell-only" $ bash -c 'echo $MYVAR' # 何も表示されない $ export MYVAR="session-wide" $ bash -c 'echo $MYVAR' # 表示される。すなわち、セッション全体に反映されている
例
以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。
デスクトップ環境の検出
- XDG_CURRENT_DESKTOP
コロンで区切られた文字列リストを含む freedesktop.org 変数。現在のデスクトップ環境を示します[4]。活発に開発されているデスクトップ環境の標準化された値として次があります: GNOME、GNOME-Flashback、KDE、LXDE、LXQt、MATE、TDE、Unity、XFCE、EDE、Cinnamon、Pantheon、DDE [5]。
- XDG_SESSION_DESKTOP
XDG_CURRENT_DESKTOP と似ていますが、単一の文字列しか許可しません。その名前にも関わらず、これは freedesktop.org によって標準化されたものではありません。
- DE
使用中のデスクトップ環境 (desktop environment) を示すレガシーな変数です。どのような値を取りうるかについての中心的なドキュメントはありませんが、xdg-utils は多くのデスクトップ環境についてのリファレンスを提供しています。
- DESKTOP_SESSION
これもレガシーな変数です。DE に似ていますが、それよりは一般的ではありません。セッションの (/usr/share/xsessions/ 内の) デスクトップエントリへのパスを格納できます [7]。
- WINDOW_MANAGER
デスクトップ環境で使用するウィンドウマネージャを選択するために時々使われる変数です。他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。
- DISPLAY
ホスト、ディスプレイ、スクリーンを指定するために X Window System によって使用されます。形式は ホスト名:ディスプレイ.スクリーン です。ディスプレイとは、共通の入力デバイス群 (キーボードやマウスなど) を共有するスクリーンの集まりを指します。ホスト名は、ディスプレイが接続されるマシンの名前を指定するためにかつて使用されていましたが、X クライアントと同じコンピュータ上で X サーバが実行される場合は空欄になっているはずです。詳細は X(7) を参照してください。
- WAYLAND_DISPLAY
Wayland における DISPLAY のようなものです。コンポジタによって設定されます。これが設定されていない場合、アプリケーションは wayland-0 を使おうと試みます。
- XAUTHORITY
.Xauthority ファイルへのパスです。このファイルには、X Window Server にアクセスするための資格情報が入っています。これは、認証のために X サーバに送られるクッキー (任意のデータ) の形で保存されます (例: MIT-MAGIC-COOKIE-1)。
システムやセッションのパス
- HOME
現在のユーザのホームディレクトリへのパスが格納されます。この変数は、アプリケーションが現在のユーザに関連した設定ファイル等を見つけるために使うことができます。
- PATH
コロンで区切られたディレクトリのリストが格納されています。システムは、この変数に登録されているディレクトリから実行ファイルを探索します。通常のコマンド (ls、systemctl、pacman など) がシェル (bash や zsh など) によって解釈される際、シェルは PATH のリスト内のディレクトリからそのコマンドと同じ名前の実行ファイルを探索し、それを実行します。PATH に含まれないディレクトリにある実行ファイルを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、./a.out や /bin/ls といった形です。
PATH にはカレント作業ディレクトリ (.) を含めないことが推奨されます。ユーザが騙されて、悪意のあるコマンドを実行してしまうかもしれないからです。- PWD
作業ディレクトリへのパスが入ります。
- OLDPWD
前の作業ディレクトリへのパスが入ります。つまり、最後に cd を実行する前の PWD です。
受信したメールの保存場所が入ります。伝統的な設定は /var/spool/mail/$LOGNAME です。
ネットワークプロキシ
- ftp_proxy
FTP プロキシサーバーが入ります。
ftp_proxy="ftp://192.168.0.1:21"
- http_proxy
HTTP プロキシサーバーが入ります。
http_proxy="http://192.168.0.1:80"
ドキュメントのパス
- MANPATH
man が man ページを探索するディレクトリのリストがコンマで区切られて格納されます。
/etc/profile に "Man is much better than us at figuring this out" (man は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです。 manpath(5) を参照。- INFODIR
info コマンドが info ページを探索するディレクトリのリストがコンマで区切られて格納されます。例: /usr/share/info:/usr/local/share/info。
デフォルトプログラム
- SHELL
ユーザの優先シェルへのパスが含まれます。この変数の値は、現在実行中のシェルである必要はないことに注意してください。この変数に値がない場合、Bash は自動的に /etc/passwd で定義されているユーザのログインシェルに設定するか、判断できない場合は /bin/sh にします。
- PAGER
ファイルの内容を一覧表示するために使用されるプログラムを実行するコマンドが含まれます。例: /bin/less。
- EDITOR
ファイルの編集に使用される軽量プログラムを実行するコマンドが含まれています (例:/usr/bin/nano)。例えば、以下の例のように、X 下では gedit を使い、それ以外では nano を使うように設定するインタラクティブスイッチを記述することができます:
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
- VISUAL
メールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています (例: vi、vim、emacs など)。
- TERMINAL
ユーザの優先ターミナルエミュレータを実行するコマンドが含まれます。これは、現在実行中のターミナル (TERM) と同じであるとは限りません。
- BROWSER
ウェブブラウザへのパスが含まれています。グラフィカル環境 (X など) が利用できるかに応じてこの変数を動的に変更するようなコードをインタラクティブシェルの設定ファイルに記述しておくと便利です:
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links
WAYLAND_DISPLAY 環境変数を使うことで、Wayland コンポジタが実行されているかどうかに応じてこれらのデフォルトプログラムを設定することができます。その他
- TERM
実行中のターミナル (terminal) の種類が格納されます (例: xterm-256color)。この変数は、ターミナル固有の機能を期待する、ターミナル内で実行されるプログラムによって使用されます (terminfo(5) を参照)。この変数は、ターミナルエミュレータによって設定されるため、シェルから上書きすることは推奨されません。
- TZ
ユーザ毎にシステムのタイムゾーンとは異なるタイムゾーンを設定するために使用することができます。/usr/share/zoneinfo/ 内にはタイムゾーンが列挙されているので、これをリファレンスとして使用することができます (例: TZ=":/usr/share/zoneinfo/Pacific/Fiji")。TZ 変数に zoneinfo ファイルを指定する場合、GNU マニュアル に従ってコロンで始める必要があります。
シェル環境の検出
シェル環境を検出するテストは、シェル環境の検出に関して書かれたリポジトリを見てください。これには、ログイン/インタラクティブシェル、Xorg セッション、TTY、SSH セッションの検出も含まれています。