環境変数

提供: ArchWiki
2017年11月7日 (火) 21:54時点におけるOotaharuki99 (トーク | 投稿記録)による版 (GNOME Wayland で環境変数を設定する方法を追記しました。)
ナビゲーションに移動 検索に移動

関連記事

環境変数とは1つ、または複数のアプリケーションによって使用されるデータを含んだ名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値は例えば、実行可能ファイルのファイルシステムにおける場所や使用するデフォルトのエディタ、システムロケールの設定などになります。Linux に慣れてないユーザーは、環境変数で設定をするのは御しがたいと考えがちですが、複数のアプリケーションと Linux のプロセスの設定を共有するシンプルな方法として環境変数が存在しています。

ユーティリティ

coreutils パッケージには printenvenv というプログラムが入っています。現在設定されている環境変数とその値を表示するには:

$ printenv
ノート: 環境変数の中にはユーザー個別のものも存在します。printenv の出力を非特権ユーザーと root で比較してみてください。

env ユーティリティを使うことで環境変数を変更してコマンドを実行することができます。以下の例では環境変数 EDITORvim に設定して xterm を起動します。以下のコマンドを実行してもグローバルな環境変数 EDITOR に影響は与えません。

$ env EDITOR=vim xterm

Bash に組み込まれている set はシェルのオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前や値を表示することができます。詳しくは、set のドキュメントを見て下さい: [1]

特定のプロセスで使われている環境変数を確認したい場合は、/proc/${PID}/environ を見て下さい。このファイルには特殊な \x0 文字が含まれています。次の関数を使うことでファイルを解析できます。

# envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }
# envof 1
TERM=linux

変数の定義

グローバル

大半の Linux ディストリビューションは、あなたに /etc/profile 等のファイルに環境変数の追加・変更を行うよう指示します。環境変数を維持管理し、それらを含む膨大な数のファイルに気を配る必要があります。原則的にあらゆるシェルスクリプトは環境変数の定義に使われる可能性がありますが、以下のような UNIX の慣例に従い特定のファイルでのみ行われるべきものです。

次のファイルがグローバルな環境変数の定義に使われるべきです: /etc/profile/etc/bash.bashrc、および /etc/environment。ファイルにはそれぞれ制限があるため、注意深く目的にあったものを選ぶべきです。

  • /etc/profile はログインシェルのみにおいて変数を初期化します。ただし、スクリプトを実行したり、全ての Bourne shell 互換シェルで使うことができます。
  • /etc/bash.bashrc はインタラクティブシェルのみにおいて変数を初期化します。スクリプトも実行しますが (名前から分かる通り) Bash でしか使えません。
  • /etc/environment は PAM-env モジュールによって使われ、ログインシェルであるかそうでないか、インタラクティブシェルであるかそうでないか、また、Bash であるかそうでないかは関係ありません。そのためスクリプトやグロブ展開を使うことは不可能です。このファイルに記述できるのは variable=value のペアだけです。

以下の例では、特定のユーザーで ~/bin ディレクトリを PATH に追加しています。適当な環境変数設定ファイル (/etc/profile あるいは /etc/bash.bashrc) に記述することで使うことができます:

# If user ID is greater than or equal to 1000 & if ~/bin exists and is a directory & if ~/bin is not already in your $PATH
# then export ~/bin to your $PATH.
if [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin) ]]
then
    export PATH=$HOME/bin:${PATH}
fi

ユーザーごと

ノート: dbus デーモンや systemd のユーザーインスタンスは .bashrc などで設定された環境変数を継承しません。そのため、D-Bus によって Nautilus などのアプリケーションが起動した場合、デフォルトで設定された環境変数を使いません。Systemd/ユーザー#環境変数を参照してください。

環境変数をグローバルに定義したくないという時もあるでしょう。例えば、PATH/home/my_user/bin を追加したいが、システム上の他のユーザーには同じ PATH を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます:

  1. シェルの設定ファイル、例えば Bash#設定ファイルZsh#設定ファイル
  2. ~/.profile は多数のシェルによってフォールバックとして使われます。wikipedia:Unix_shell#Configuration_files_for_shells を参照。
  3. ~/.pam_environment/etc/environment のユーザー個別の設定で、PAM-env モジュールによって使われます。詳しくは pam_env(8)pam_env.conf(5) を参照。

ローカルで PATH にディレクトリを追加したい場合、以下のように ~/.bash_profile に記述します:

export PATH="${PATH}:/home/my_user/bin"

変数をアップデートするために、再ログインするかファイルを source してください: $ source ~/.bash_profile

グラフィカルアプリケーション

GUI アプリケーションの環境変数を設定したいときは、xinitrc (ディスプレイマネージャを使う場合 xprofile) に変数を記述することができます。例:

~/.xinitrc
export PATH="${PATH}:~/scripts"
export GUIVAR=value

GNOME Wayland は xprofile を読み込みません。GDM を使う場合、代わりにフォルダ ~/.local/share/gdm/env.d/ (ユーザーのみ) または /usr/share/gdm/env.d/ (全てのユーザー) の中に置いた任意のファイルに変数を記述することができます。例:

~/.local/share/gdm/env.d/envs
PATH="${PATH}:~/scripts"
GUIVAR=value

セッションごと

時としてもっと限られた定義が必要になる場面もあります。絶対パスを入力せずに指定したディレクトリから一時的に実行ファイルを起動したい場合や、アプリケーションを実行するために短時間だけ ~/.bash_profile を編集しなくてはならない場合などです。

その場合、export コマンドを使うことで、現在のセッションのみで PATH 変数を定義することができます。ログアウトするまでは、PATH 変数は一時的な設定が使われます。PATH に特定のディレクトリを追加するには、次を実行:

$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"

サンプル

以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。

  • DE は使用しているデスクトップ環境 (Desktop Environment) を示します。xdg-open はこの環境変数を使ってデスクトップ環境に含まれているユーザーフレンドリーなファイルオープナアプリケーションを選択します。この機能を使うにはインストールする必要があるパッケージが存在します。GNOME の場合、libgnomeAUR が必要です。Xfce の場合、exo が必要です。使用される DE 変数の値: gnome, kde, xfce, lxde, mate
DE 環境変数はウィンドウマネージャを起動する前にエクスポートする必要があります。例:
~/.xinitrc
export DE="xfce"
exec openbox
上記の設定をすると、Xfce の中で実行されていると認識され xdg-open がユーザーフレンドリーな exo-open を使うようになります。設定したいときは exo-preferred-applications を使って下さい。
  • DESKTOP_SESSIONDE と似ていますが、LXDE デスクトップ環境で使われています: DESKTOP_SESSIONLXDE に設定されている場合、xdg-openpcmanfm のファイル関連付けを使います。
  • PATH はコロンで区切られたディレクトリのリストで、システムが実行ファイルを探す対象となります。通常のコマンド (例: pacman, systemctl など) をシェルに打ち込むと、このリストにあるディレクトリから同じ名前の実行ファイルが探され、そして実行されます。PATH に含まれないディレクトリ下のものを実行するには、実行ファイルへの絶対パスが必要です: /opt/adobe-air-sdk/bin/adl
ノート: ユーザーが悪意のあるプログラムを実行してしまう可能性があるため、セキュリティ上の理由から PATH に現在のワーキングディレクトリ . を含めないことを推奨します。
  • HOME は現在のユーザーのホームディレクトリが入ります。この変数は、アプリケーションが現在のユーザーに関連した設定ファイル等を見つけるために使われます。
  • PWD にはワーキングディレクトリのパスが入ります。
  • OLDPWD には前のワーキングディレクトリのパスが入ります。つまり最後に cd を実行する前の PWD です。
  • SHELL には実行中の、インタラクティブシェルの名前が入ります。例: bash
  • TERM には実行中のターミナルの名前が入ります。例: xterm
  • PAGER にはテキストファイルを閲覧するために使われるコマンドが入ります。例: /bin/less
  • EDITOR にはテキストファイルを編集するために使われる軽量なエディタのコマンドが入ります。例: /usr/bin/nano。例えば、以下のようにすることで X 環境下では gedit、そうでなければ nano を使用するようにできます:
export EDITOR="$(if [[ -n $DISPLAY ]]; then echo 'gedit'; else echo 'nano'; fi)"
  • VISUAL にはメールの編集など、作業量が多いことをするのに使う、フル機能のエディタを実行するコマンドを指定します (例: vi, vim, emacs など)。
  • MAIL には受信したメールの保存場所が入ります。一般的な設定は /var/spool/mail/$LOGNAME です。
  • BROWSER にはウェブブラウザのパスを指定します。インタラクティブシェルの設定ファイルで以下のように設定することで、X など、グラフィカル環境が存在するかどうかで動的にウェブブラウザを変更することが可能です:
if [ -n "$DISPLAY" ]; then
    export BROWSER=firefox
else 
    export BROWSER=links
fi
  • ftp_proxyhttp_proxy にはそれぞれ FTP と HTTP プロキシサーバーを記述します:
ftp_proxy="ftp://192.168.0.1:21"
http_proxy="http://192.168.0.1:80"
  • MANPATH には man が man ページを探すときに使うコロン区切りのディレクトリのリストが入ります。
ノート: /etc/profile に "Man is much better than us at figuring this out" (man は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです: /usr/share/man:/usr/local/share/man
  • INFODIR には info コマンドが info ページを探す際に使うコロン区切りのディレクトリのリストが入ります。例: /usr/share/info:/usr/local/share/info
  • TZ はユーザー別にシステムと違うタイムゾーンを指定するために使うことができます。/usr/share/zoneinfo/ に記載されているタイムゾーンを参考にしてください。 例: TZ="/usr/share/zoneinfo/Pacific/Fiji"

pam_env を使う

/etc/environment~/.pam_environment には癖があり、man ページ (pam_env(8)pam_env.conf(5)) には明白な記述がありません。例:

~/.pam_environment
LANG             DEFAULT=en_US.UTF-8
LC_ALL           DEFAULT=${LANG}

XDG_CONFIG_HOME  DEFAULT=@{HOME}/.config
#XDG_CONFIG_HOME=@{HOME}/.config                    # is **not** valid see below
XDG_DATA_HOME    DEFAULT=@{HOME}/.local/share
 
# you can even use recently defined variables
RCRC             DEFAULT=${XDG_CONFIG_HOME}/rcrc
BROWSER=firefox
#BROWSER         DEFAULT=firefox # same as above
EDITOR=vim

~/.pam_environment では2つの方法で環境変数を設定できます:

VARIABLE=VALUE

または:

VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]

前者では ${VARIABLES} が使えませんが、後者では使えます。 @{HOME} /etc/passwd の定義を拡張する特殊な変数です ( @{SHELL} も同じ)。VARIABLE を定義したら、 ${VARIABLE} で使うことができます。前に定義した変数を呼び出すときは中括弧とドル記号が必須なので注意してください ( ${} )。

ノート: 上記のファイルは ~/.{,bash_,z}profile ~/.zshenv よりも前に読み込まれます。

参照