環境変数

提供: ArchWiki
2022年12月5日 (月) 14:46時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎サンプル: 飜訳および記事の削除、追加)
ナビゲーションに移動 検索に移動

関連記事

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

ユーティリティ

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

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

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

$ env EDITOR=vim xterm

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

各プロセスは環境を /proc/$PID/environ ファイルに保存します。このファイルには、ヌル文字 (\x0) で区切られた各キーと値のペアが含まれています。sed を使用するとより読み易い形式で取得できます。例: sed 's:\x0:\n:g' /proc/$PID/environ.

変数の定義

環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや 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 から変数を読み込みます。

ノート:
  • これらのファイルは、他のファイル、特に、~/.profile~/.bash_profile~/.zshenv より前に読み込まれます。
  • 非推奨の ~/.pam_environment はもう読み込まれません。FS#68945を参照してください。

/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
ノート: 変数 ${HOME} および ${SHELL} は、HOME および SHELL 環境変数にはデフォルトではリンクされていません。

また、このフォーマットでは、${VARIABLE} を使って、既に定義されている変数を他の変数の値で展開することができます。

GOPATH DEFAULT=${XDG_DATA_HOME}/go

VARIABLE=value のペアも可能ですが、これらのペアでは変数の展開はサポートされていません。詳しくは pam_env.conf(5) を参照してください。

ユーザーごと

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

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

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

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

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

グラフィック環境変数

環境変数がグラフィカルなアプリケーションにしか影響しない場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。スコープの降順:

デスクトップ環境セッションごと

いくつかのグラフィカルな環境 (例えば KDE Plasma) はログイン時にシェルスクリプトを実行することをサポートしており、環境変数の設定に利用することができます。KDE#自動起動 を参照してください。

Xorg セッションごと

Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります。

スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です。

~/.xprofile, ~/.xinitrc, or ~/.xsession
...
export GUI_VAR=value
...
Wayland セッションごと

Wayland は Xorg 関連のファイルを起動しないので、GDMKDE 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 システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。

  • DE は使用中の desktop environment を示すレガシー変数です。どのような値が可能かについての中心的なドキュメントはありませんが、xdg-utils は多くのデスクトップ環境についてのリファレンスを提供しています。
  • DESKTOP_SESSIONDE と似ていますが、LXDE デスクトップ環境で使われています: DESKTOP_SESSIONLXDE に設定されている場合、xdg-openpcmanfm のファイル関連付けを使います。
  • WINDOW_MANAGER は、デスクトップ環境で使用する ウィンドウマネージャ を「選択」するために時々使われる変数で、他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。
  • PATH はコロンで区切られたディレクトリのリストで、システムが実行ファイルを探す対象となります。通常のコマンド (ls, pacman, systemctl など) をシェル(bashzsh など)に打ち込むと、このリストにあるディレクトリから同じ名前の実行ファイルが探され、そして実行されます。PATH に含まれないディレクトリ下のものを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、./a.out/bin/ls です。
ノート: ユーザーが悪意のあるプログラムを実行してしまう可能性があるため、セキュリティ上の理由から PATH に現在のワーキングディレクトリ . を含めないことを推奨します。
  • HOME は現在のユーザーのホームディレクトリが入ります。この変数は、アプリケーションが現在のユーザーに関連した設定ファイル等を見つけるために使われます。
  • OLDPWD には前のワーキングディレクトリのパスが入ります。つまり最後に cd を実行する前の PWD です。
  • SHELL には実行中の、インタラクティブシェルの名前が入ります。例: bash
  • TERM には実行中のターミナルの名前が入ります。例: xterm
  • MAIL には受信したメールの保存場所が入ります。一般的な設定は /var/spool/mail/$LOGNAME です。
  • 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 は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです。 manpath(5) を参照。
  • INFODIR には info コマンドが info ページを探す際に使うコロン区切りのディレクトリのリストが入ります。例: /usr/share/info:/usr/local/share/info
  • TZ はユーザー別にシステムと違うタイムゾーンを指定するために使うことができます。/usr/share/zoneinfo/ に記載されているタイムゾーンを参考にしてください。 例: TZ="/usr/share/zoneinfo/Pacific/Fiji"。When pointing the TZ variable to a zoneinfo file, it should start with a colon per the GNU manual.

デフォルトプログラム

  • SHELL にはユーザーの優先シェルへのパスが含まれます。Bash は起動時にこの変数を設定しますが、これは必ずしも現在実行中のシェルではないことに注意してください。
  • PAGER にはファイルの内容を一覧表示するために使用されるプログラムを実行するコマンドが含まれます。例: /bin/less
  • EDITOR にはファイルの編集に使用される軽量プログラムを実行するコマンドが含まれています(例:/usr/bin/nano など)。例えば、この例のように、X の下の geditnano を対話的に切り替えるように書くことができます。
export EDITOR="$(if [[ -n $DISPLAY ]]; then echo 'gedit'; else echo 'nano'; fi)"
  • VISUAL にはメールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています(例: vivimemacs など)。
  • BROWSER はウェブブラウザのパスが含まれています。X などのグラフィック環境に応じて動的に変更できるように、対話型のシェル設定ファイルに書いておくと便利です。
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links
ヒント: These default programs can also be set conditionally if a Wayland compositor is running by using the WAYLAND_DISPLAY environment variable.

参照

翻訳ステータス: このページは en:Environment variables の翻訳バージョンです。最後の翻訳日は 2022-12-01 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。