「環境変数」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ユーザーごと: 不要箇所を削除)
(→‎参照: update TranslationStatus.)
 
(3人の利用者による、間の46版が非表示)
2行目: 2行目:
 
[[de:Umgebungsvariablen]]
 
[[de:Umgebungsvariablen]]
 
[[en:Environment variables]]
 
[[en:Environment variables]]
  +
[[es:Environment variables]]
  +
[[pt:Environment variables]]
 
[[ru:Environment variables]]
 
[[ru:Environment variables]]
 
[[zh-hans:Environment variables]]
 
[[zh-hans:Environment variables]]
8行目: 10行目:
 
{{Related|systemd/ユーザー#環境変数}}
 
{{Related|systemd/ユーザー#環境変数}}
 
{{Related articles end}}
 
{{Related articles end}}
環境変数とは1つ、または複数のアプリケーションによって使用されるデータを含んだ名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値は例えば、実行可能ファイルのファイルシステムにおける場所や使用するデフォルトのエディタ、システムロケールの設定などになります。Linux に慣れてないユーザーは、環境変数で設定をするのは御しがたいと考えがちです、複数のアプリケーションと Linux のプロセスの設定を共有するシンプルな方法して環境変数が存在しています。
+
環境変数とは 1 以上のアプリケーションによって使用されるデータを含名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値としては、実行可能ファイルのファイルシステムにおける場所や使用するデフォルトのエディタ、システムロケールの設定などがあります。Linux に慣れてないユーザーは、環境変数で設定をするのは御しがたいと考えがちです。しかし環境変数は、Linux で複数のアプリケーションとプロセスの間で設定を共有するためのシンプルな方法を提供してくれます。
   
 
== ユーティリティ ==
 
== ユーティリティ ==
  +
{{Pkg|coreutils}} パッケージには ''printenv'' と ''env'' というプログラムが入っています。現在設定されている環境変数とその値を表示するには:
 
  +
{{Pkg|coreutils}} パッケージには ''printenv'' と ''env'' というプログラムが含まれています。現在の環境変数とその値を一覧表示するには:
   
 
$ printenv
 
$ printenv
   
{{Note|環境変数の中にはユーザ個別のものも存在します。''printenv'' の出力を非特権ユーザと ''root'' で比較しててください。}}
+
{{Note|環境変数の中にはユーザ個別のものも存在します。''printenv'' の出力を非特権ユーザの場合と ''root'' ユーザの場合で比較して確認してください。}}
   
{{ic|env}} ユーティリティを使うことで環境変数を変更してコマンドを実行することができます。以下の例では環境変数 {{ic|EDITOR}} を {{ic|vim}} に設定して ''xterm'' を起動します。以下のコマンドを実行してもグローバルな環境変数 {{ic|EDITOR}} に影響与えません。
+
''env'' ユーティリティを使うことで環境変数を変更してコマンドを実行することができます。以下の例では環境変数 {{ic|EDITOR}} を {{ic|vim}} に設定して ''xterm'' を起動します。以下のコマンドを実行してもグローバルな {{ic|EDITOR}} 変数影響与えません。
   
 
$ env EDITOR=vim xterm
 
$ env EDITOR=vim xterm
   
[[Bash]] 組み込まれている ''set'' はシェルオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前値を表示することができます。詳しくは、[https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin set 組み込みドキュメント]を参照してください
+
[[シェル]] の {{man|1p|set}} 組み込みコマンドを使えば、シェルオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前とその値を出力したりできます。
   
各プロセスは環境を {{ic|/proc/$PID/environ}} ファイルに保存します。このファイルには、ヌル文字 ({{ic|\x0}}) で区切られたキーと値のペアが含まれています。[[sed]] を使用するとより読み易い形式で取得できます。例: {{ic|sed 's:\x0:\n:g' /proc/$PID/environ}}.
+
各プロセスはその環境変数を {{ic|/proc/$PID/environ}} ファイルに保存しています。このファイルには、ヌル文字 ({{ic|\x0}}) で区切られたキーと値のペアが含まれています。[[sed]] を使用するとより読み易い形式で取得できます。例: {{ic|sed 's:\x0:\n:g' /proc/$PID/environ}}
   
 
== 変数の定義 ==
 
== 変数の定義 ==
   
環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや systemd サービスでは、変数を有効にするために特定の場所設定することが要求されます。環境変数のスコープは、それらが影響を与えるコンテキストに分解されます
+
環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや systemd サービスでは、変数を有効にするために特定の場所設定することが要求されます。環境変数のスコープは、それらが影響を与えるコンテキストに分けられます:
   
* [[#グローバル|グローバル]]: あらゆるユーザが実行する全てのプログラム、systemd サービスは含まれません。
+
* [[#グローバル|グローバル]]: あらゆるユーザが実行する全プログラム。Systemd サービスは含まれません。
* [[#ユーザーごと|ユーザ別]]: 特定のユーザが実行する全てのプログラム。ユーザー systemd サービス (参照 [[Systemd/ユーザー#環境変数]]) やグラフィカルアプリケーション (参照 [[#グラフィック環境変数]]) は含まれない
+
* [[#ユーザーごと|ユーザ別]]: 特定のユーザが実行する全プログラム。Systemd ユーザサービス ([[Systemd/ユーザー#環境変数]] を参照) やグラフィカルアプリケーション ([[#グラフィック環境]] を参照) は含まれません
   
 
=== グローバル ===
 
=== グローバル ===
   
==== シェルの初期化ファイル使 ====
+
==== シェルの初期化ファイル使 ====
   
大半の Linux ディストリビューションは、あなたに {{ic|/etc/profile}} 等のファイルに環境変数の追加・変更を行うよう指示します。環境変数維持管理それらを含む膨大な数のファイルに配る必要があります。原則的にあらゆるシェルスクリプトは環境変数の定義に使われる可能性ありますが、以下のような UNIX の慣例に従い特定のファイルでのみ行われるべきものです。
+
大半の Linux ディストリビューションは、あなたに {{ic|/etc/profile}} 等のファイルに環境変数の追加・変更を行うよう指示します。また、{{ic|/etc/locale.conf}} のような変数設定を含むパッケージ固有の設定ファイルがあることも覚えておいてください。環境変数維持管理は必ず行い環境変数を含むことができる多数のファイルに注意払うようにしてください。原則的にあらゆるシェルスクリプトは環境変数の初期化に使うことできますが、以下のような UNIX の慣例に従い特定のファイルでのみ行われるべきです。
   
のファイルグローバルな環境変数定義に使われるべ: {{ic|/etc/profile}}{{ic|/etc/bash.bashrc}}、および {{ic|/etc/environment}}。ファイルにはそれぞれ制限があるため、注意深く目的にあったものを選ぶべきで
+
以下のファイルは、システムのグローバルな環境変数定義するために使用で、それぞれに異なる制限がありま:
   
*{{ic|/etc/environment}} は PAM-env モジュールによって使れ、ログインシェルであるかそうでないか、インタラクティブシェルであるかそうでないか、また、Bash であるかそうでないかは関係ありません。そのためスクリプトやグロブ展開使うことは不可能。このファイルに記述できるの {{ic|1=''variable=value''}} のペアだけです。詳細は {{man|8|pam_env}} あるは {{man|8|pam_env.conf}} を参照てください
+
* {{ic|/etc/environment}} は [[#pam_env を使う|pam_env モジュール]]によって使用され、シェルに依存しないた、スクリプトやグロブ展開使きません。このファイルは{{ic|1=''変数=''}} う形式か受け入れません
*{{ic|/etc/profile}} はログインシェル''のみ''において変数を初期化します。ただし、スクリプトを実行したりての [[wikipedia:ja:Bourne Shell|Bourne shell]] 互換シェルで使ことができます。
+
* {{ic|/etc/profile}} はログインシェル''のみ''に対して変数を初期化します。しかし、このファイルはスクリプト (例: {{ic|/etc/profile.d/}} 内にあるファイル) を実行し、すべての [[wikipedia:ja:Bourne Shell|Bourne shell]] 互換シェルで使用することができます。
  +
* シェル固有の設定ファイル - [[シェル]]のグローバルな設定ファイルで、変数の初期化やスクリプトの実行を行います。例えば [[Bash#設定ファイル]] (例: {{ic|~/.bashrc}})) や [[Zsh#スタートアップ/シャットダウン ファイル]] (例: {{ic|~/.zshrc}}) です。
*{{ic|/etc/bash.bashrc}} はインタラクティブシェル''のみ''において変数を初期化します。スクリプトも実行しますが (名前から分かる通り) Bash でしか使えません。
 
   
以下の例では、特定ユーザーで {{ic|~/bin}} ディレクトリを {{ic|PATH}} に追加しています。適当な環境変数設定ファイル ({{ic|/etc/profile}} あるいは {{ic|/etc/bash.bashrc}}) に記述すること使うことができます:
+
以下の例では、複数ディレクトリ (例えば {{ic|~/bin}} と {{ic|~/scripts}}) それぞれのユーザーの {{ic|PATH}} に追加する関数を作成しています。これを行うには、以下を任意のグローバル環境変数設定ファイル ({{ic|/etc/profile}} または {{ic|/etc/bash.bashrc}}) に記述するだけです:
   
 
{{bc|<nowiki>
 
{{bc|<nowiki>
  +
set_path(){
# 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.
 
  +
# ユーザ ID が 1000 以上であるか確認する
if [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin) ]]
 
  +
[ "$(id -u)" -ge 1000 ] || return
then
 
  +
export PATH=$HOME/bin:${PATH}
 
  +
for i in "$@";
fi
 
  +
do
  +
# ディレクトリが存在するか確認する
  +
[ -d "$i" ] || continue
  +
  +
# ディレクトリが $PATH に既に存在するか確認する
  +
echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue
  +
  +
# ディレクトリを $PATH の末尾に追加し、export する
  +
export PATH="${PATH}:$i"
  +
done
  +
}
  +
  +
set_path ~/bin ~/scripts
 
</nowiki>}}
 
</nowiki>}}
  +
  +
異なるシェル間で環境変数を共有する1つの方法として、{{ic|envsubst}} によって直接読み込むことのできるファイルを、'''コメント、空行、スペース (bash) を含めずに'''、作成するというものがあります ([https://unix.stackexchange.com/questions/176322/share-environment-variables-between-bash-and-fish] から着想を得ました):
  +
  +
{{hc|.env|2=
  +
EDITOR=vim
  +
XDG_CACHE_HOME=$HOME/.cache
  +
XDG_CONFIG_HOME=$HOME/.config
  +
XDG_DATA_HOME=$HOME/.local/share
  +
XDG_STATE_HOME=$HOME/.local/state
  +
}}
  +
  +
{{hc|~/bashrc|export $(envsubst < .env)}}
  +
  +
{{hc|~/config/fish/config.fish|export (envsubst < .env)}}
   
 
==== pam_env を使う ====
 
==== pam_env を使う ====
   
[[PAM]] モジュール {{man|8|pam_env}} は、環境設定する変数を以下のファイルから順番に読み込みます{{ic|/etc/security/pam_env.conf}}, {{ic|/etc/environment}} から変数を読み込みます。
+
{{man|8|pam_env}} [[PAM]] モジュールは、環境変数の設定を以下のファイルから順番にロードします: {{ic|/etc/security/pam_env.conf}} {{ic|/etc/environment}} の順です。
   
 
{{Note|
 
{{Note|
 
* これらのファイルは、他のファイル、特に、{{ic|~/.profile}}、{{ic|~/.bash_profile}}、{{ic|~/.zshenv}} より前に読み込まれます。
 
* これらのファイルは、他のファイル、特に、{{ic|~/.profile}}、{{ic|~/.bash_profile}}、{{ic|~/.zshenv}} より前に読み込まれます。
* 非推奨の {{ic|~/.pam_environment}} はもう読み込まれません。{{Bug|68945}}を参照してください。
+
* 非推奨の {{ic|~/.pam_environment}} はもう読み込まれません。{{Bug|68945}} を参照してください。
 
}}
 
}}
   
{{ic|/etc/environment}} は、例えば、別々の行にある単純な {{ic|1=''VARIABLE''=''value''}} ペアで構成されていなければなりません。
+
{{ic|/etc/environment}} は、{{ic|1=''変数''=''''}} というペアを1行に1つずつ記述しなければなりません。例:
   
  +
{{hc|/etc/environment|2=
EDITOR=nano
 
  +
EDITOR=nano
  +
}}
   
{{ic|/etc/security/pam_env.conf}} と {{ic|~/.pam_environment}} は以下のように共通です
+
{{ic|/etc/security/pam_env.conf}} は以下の形式記述しま:
   
  +
{{hc|/etc/security/pam_env.conf|2=
VARIABLE [DEFAULT=''value''] [OVERRIDE=''value'']
 
  +
VARIABLE [DEFAULT=''value''] [OVERRIDE=''value'']
  +
}}
   
{{ic|@{HOME}}} と {{ic|@{SHELL}}} は、{{ic|/etc/passwd}} で定義されているものに拡張される特別な変数です。次の例は、{{ic|HOME}} 環境変数を別の変数に展開する方法を示しています
+
{{ic|@{HOME} }} と {{ic|@{SHELL} }} は、{{ic|/etc/passwd}} で定義されているものに拡張される特別な変数です。次の例は、{{ic|HOME}} 環境変数を別の変数に展開する方法を示しています:
   
  +
{{hc|/etc/security/pam_env.conf|2=
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
 
  +
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
  +
}}
   
{{Note|変数 {{ic|${HOME}} および {{ic|${SHELL}} は {{ic|HOME}} および {{ic|SHELL}} デフォルトでは環境変数にリンクされていません。}}
+
{{Note|変数 {{ic|${HOME} }} および {{ic|${SHELL} }} は{{ic|HOME}} および {{ic|SHELL}} 環境変数にリンクされていません。これらはデフォルトでは設定されていません。}}
   
また、このフォーマットでは、{{ic|${''VARIABLE''}} を使って、既に定義されている変数を他の変数の値で展開することができます。
+
また、この形式では、{{ic|${''VARIABLE''} }} を使って、既に定義されている変数を他の変数の値で展開することができます。例えば:
   
 
GOPATH DEFAULT=${XDG_DATA_HOME}/go
 
GOPATH DEFAULT=${XDG_DATA_HOME}/go
   
 
{{ic|1=''VARIABLE''=''value''}} のペアも可能ですが、これらのペアでは変数の展開はサポートされていません。詳しくは {{man|5|pam_env.conf}} を参照してください。
 
{{ic|1=''VARIABLE''=''value''}} のペアも可能ですが、これらのペアでは変数の展開はサポートされていません。詳しくは {{man|5|pam_env.conf}} を参照してください。
 
{{Note|これらのファイルは他のファイル、特に {{ic|~/.profile}}, {{ic|~/.bash_profile}}, {{ic|~/.zshenv}} よりも先に読み込まれることに注意してください。}}
 
   
 
=== ユーザーごと ===
 
=== ユーザーごと ===
90行目: 124行目:
 
環境変数をグローバルに定義したくないという時もあるでしょう。例えば、{{ic|PATH}} に {{ic|/home/my_user/bin}} を追加したいが、システム上の他のユーザーには同じ {{ic|PATH}} を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます:
 
環境変数をグローバルに定義したくないという時もあるでしょう。例えば、{{ic|PATH}} に {{ic|/home/my_user/bin}} を追加したいが、システム上の他のユーザーには同じ {{ic|PATH}} を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます:
   
* シェルの設定ファイル例えば [[Bash#設定ファイル]] や [[Zsh#スタートアップ/シャットダウン ファイル]]。
+
* [[シェル]]ユーザ設定ファイル例えば[[Bash#設定ファイル]] や [[Zsh#スタートアップ/シャットダウン ファイル]]。
  +
** あなたが開くターミナル (例: コマンドラインアプリケーションのみ) に変数のスコープを制限しない限り、ログインシェルの変数も変更されます。
* [[systemd/ユーザー#環境変数|systemd ユーザー環境変数]] は {{ic|~/.config/environment.d/*.conf}} から環境変数が読み込まれます。
 
  +
* [[systemd/ユーザー#環境変数|systemd ユーザ環境変数]]は {{ic|~/.config/environment.d/*.conf}} から読み込まれます。
   
ローカルで {{ic|PATH}} にディレクトリを追加したい場合、以下のよう {{ic|~/.bash_profile}} に記述します:
+
ローカルで使用するディレクトリを {{ic|PATH}} に追加するは、{{ic|~/.bash_profile}} に次のように記述します:
   
 
export PATH="${PATH}:/home/my_user/bin"
 
export PATH="${PATH}:/home/my_user/bin"
   
変数をアップデートするために、再ログインするかファイルを ''source'' してください: {{ic|$ source ~/.bash_profile}}
+
変数をアップデートするために、再ログインするかファイルを [[source]] してください: {{ic|$ source ~/.bash_profile}}
   
{{Note|dbus デーモンや systemd のユーザインスタンスは {{ic|.bashrc}} などで設定された環境変数を継承しません。そのためD-Bus によって Nautilus などのアプリケーションが起動した場合、デフォルトで設定された環境変数を使いません。[[Systemd/ユーザー#環境変数]]を参照してください。}}
+
{{Note|dbus デーモンや systemd のユーザインスタンスは{{ic|~/.bashrc}} などのような場所で設定された環境変数を継承しません。これはつまりdbus によってアクティブ化されたプログラム ([[GNOME Files]] など) はそのような変数をデフォルトで使用しなことを意味し。[[Systemd/ユーザー#環境変数]] を参照してください。}}
   
  +
{{Tip|{{ic|export -p}} を実行することで、ユーザセッションに対して宣言されたグローバルな環境変数とローカルな環境変数を見ることができます。}}
==== グラフィック環境変数 ====
 
   
  +
==== グラフィック環境 ====
環境変数がグラフィカルアプリケーションにのみ影響する場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。
 
   
  +
環境変数がグラフィカルなアプリケーションにしか影響しない場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。スコープを大きい順に並べると:
In order of decreasing scope:
 
   
  +
* [[#Xorg セッションごと]] および [[#Wayland セッションごと]] - DE を含むグラフィカルセッション全体に影響します。
* [[#Per Xorg session]] and [[#Per Wayland session]] affect the whole graphical session, certainly including the DE.
 
  +
* [[#デスクトップ環境セッションごと]] - グラフィカルセッション内で生成されたアプリケーションに影響を与えます。DE 自体にも影響を与える可能性があります。
* [[#Per desktop environment session]] affects the applications spawned within graphical session, potentially including the DE itself.
 
  +
* [[#アプリケーションごと]] - 特定のグラフィカル アプリケーションだけに影響します。
* [[#Per application]] affects just a particular graphical application.
 
   
 
===== デスクトップ環境セッションごと =====
 
===== デスクトップ環境セッションごと =====
   
いくつかのグラフィカル環境 (例えば [[KDE Plasma]]) はログイン時シェルスクリプト実行することをサポートしており、環境変数の設定に利用することができます。[[KDE#自動起動]] を参照してください。
+
一部のグラフィカル環境 (例えば [[KDE Plasma]]) はログイン時シェルスクリプト実行をサポートしており、環境変数の設定に利用することができます。例としては [[KDE#自動起動]] を参照してください。
   
 
===== Xorg セッションごと =====
 
===== Xorg セッションごと =====
   
Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります
+
Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります:
* ほとんどの [[ディスプレイマネージャ|ディスプレイマネージャ]] は [[xprofile]] をソースとしています。
+
* ほとんどの[[ディスプレイマネージャ]]は [[xprofile]] を読み込みます。
 
* [[startx]] と [[SLiM]] は [[xinitrc]] を実行します。
 
* [[startx]] と [[SLiM]] は [[xinitrc]] を実行します。
 
* [[XDM]] は {{ic|~/.xsession}} を実行します: [[XDM#セッションの定義]] を参照して下さい。
 
* [[XDM]] は {{ic|~/.xsession}} を実行します: [[XDM#セッションの定義]] を参照して下さい。
  +
* [[LightDM]][https://gitlab.archlinux.org/archlinux/packaging/packages/lightdm/-/blob/main/Xsession] および [[SDDM]][https://github.com/sddm/sddm/blob/master/data/scripts/Xsession] は、ログイン シェルのスタートアップ スクリプトも読み込みます。例えば、[[bash]] の場合は {{ic|~/.bash_profile}}、[[zsh]] の場合は {{ic|~/.zprofile}} および {{ic|~/.zlogin}} です。
   
スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です
+
スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です:
   
 
{{hc|~/.xprofile, ~/.xinitrc, or ~/.xsession|2=
 
{{hc|~/.xprofile, ~/.xinitrc, or ~/.xsession|2=
132行目: 168行目:
 
===== Wayland セッションごと =====
 
===== Wayland セッションごと =====
   
[[Wayland]] は Xorg 関連のファイルを起動しないので、[[GDM]] と [[KDE Plasma]] 代わりに [[systemd/ユーザー#環境変数|systemd/ユーザーの環境変数]] ソースとしています。
+
[[Wayland]] は Xorg 関連のファイルを起動しないので、[[GDM]] と [[KDE Plasma]] 代わりに [[systemd/ユーザー#環境変数|systemd ユーザ環境変数]]を読み込みます。
   
 
{{hc|~/.config/environment.d/envvars.conf|2=
 
{{hc|~/.config/environment.d/envvars.conf|2=
138行目: 174行目:
 
}}
 
}}
   
Wayland セッションをサポートする他のディスプレイマネージャ([[SDDM]] など)はまだこサポートを提供していません。
+
Wayland セッションをサポートする他のディスプレイマネージャ (例: [[SDDM]]) まだこれを直接はサポートしていません。しかし、[[LightDM]] と [[SDDM]] はログインシェルのスタートアップスクリプトを Wayland セッションでも読み込みます
   
  +
[[greetd]] も {{ic|/etc/profile}} および {{ic|~/.profile}} を読み込みます。この動作は、デフォルトで有効になっている {{ic|source_profile}} 設定によって制御されます。
===== Per application =====
 
   
  +
{{ic|~/.bash_profile}} などのスタートアップスクリプトを読み込むディスプレイマネージャを使用していて、{{ic|environment.d}} を使用したい場合、以下のように読み込むことができます:
To set environment variables only for a specific application instead of the whole session, edit the application's ''.desktop'' file. See [[Desktop entries#Modify environment variables]] for instructions.
 
   
  +
{{hc|~/.bash_profile|
For [[Steam]] games, you can configure a program's environment by editing its launch options; see [[Steam#Launch options]].
 
  +
# systemd-environment-d-generator(8) を使用して環境を生成し、その変数をエクスポートする
  +
set -o allexport
  +
source <(/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator)
  +
set +o allexport
  +
}}
  +
{{Note|{{ic|/usr/lib/systemd/user-environment-generators}} にある他のジェネレーター、例えば {{ic|60-flatpak}} は環境変数の値を引用符で囲まない場合があります。この場合、出力は {{ic|export -- "$(/usr/lib/systemd/user-environment-generators/60-flatpak)"}} を使用して読み込む必要があります。}}
   
=== セッションごと ===
+
===== アプリケーションごと =====
   
  +
セッション全体ではなく、特定のアプリケーションにのみ環境変数を設定するには、そのアプリケーションの ''.desktop'' ファイルを編集してください。その方法は [[デスクトップエントリ#環境変数の変更]] を参照してください。
時としてもっと限られた定義が必要になる場面もあります。絶対パスを入力せずに指定したディレクトリから一時的に実行ファイルを起動したい場合や、アプリケーションを実行するために短時間だけ {{ic|~/.bash_profile}} を編集しなくてはならない場合などです。
 
   
  +
[[Steam]] ゲームでは、起動オプションを編集することでプログラムの環境を設定することができます。[[Steam#起動オプション]] を参照してください。
その場合、''export'' コマンドを使うことで、現在のセッションのみで {{ic|PATH}} 変数を定義することができます。ログアウトするまでは、{{ic|PATH}} 変数は一時的な設定が使われます。{{ic|PATH}} に特定のディレクトリを追加するには、次を実行:
 
   
  +
=== セッションまたはシェルごと ===
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
 
   
  +
時として、一時的な変数のみが必要である場合もあります。作成した特定のディレクトリ内の実行ファイルを実行する際に一時的に絶対パスを入力する手間を省きたい場合や、一時的な短いシェルスクリプトでそのパスを使用したい場合があるでしょう。
== サンプル ==
 
以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。
 
   
  +
例えば、現在のシェルに {{ic|PATH}} 変数を定義できますし、あるいは ''export'' コマンドを使えばセッションからログアウトするまで全てのシェルで有効な {{ic|PATH}} 変数を定義することもできます。セッション固有のディレクトリを {{ic|PATH}} に追加するには、以下を実行してください:
*{{ic|DE}} は使用しているデスクトップ環境 (''D''esktop ''E''nvironment) を示します。[[xdg-open]] はこの環境変数を使ってデスクトップ環境に含まれているユーザーフレンドリーなファイルオープナアプリケーションを選択します。この機能を使うにはインストールする必要があるパッケージが存在します。[[GNOME]] の場合、{{AUR|libgnome}} が必要です。[[Xfce]] の場合、{{pkg|exo}} が必要です。使用される {{ic|DE}} 変数の値: {{ic|gnome}}, {{ic|kde}}, {{ic|xfce}}, {{ic|lxde}}, {{ic|mate}}。
 
   
  +
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"
:{{ic|DE}} 環境変数はウィンドウマネージャを起動する前にエクスポートする必要があります。例:
 
   
  +
シェル固有のディレクトリだけを {{ic|PATH}} に追加するには、以下を実行してください:
{{hc|~/.xinitrc|2=
 
  +
$ PATH="${PATH}:/home/my_user/tmp/usr/bin"
export DE="xfce"
 
exec openbox
 
}}
 
   
  +
== 例 ==
:上記の設定をすると、Xfce の中で実行されていると認識され ''xdg-open'' がユーザーフレンドリーな ''exo-open'' を使うようになります。設定したいときは ''exo-preferred-applications'' を使って下さい。
 
   
  +
以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。
*{{ic|DESKTOP_SESSION}} は {{ic|DE}} と似ていますが、[[LXDE]] デスクトップ環境で使われています: {{ic|DESKTOP_SESSION}} が {{ic|LXDE}} に設定されている場合、''xdg-open'' は ''pcmanfm'' のファイル関連付けを使います。
 
   
  +
* {{ic|XDG_CURRENT_DESKTOP}} は [[freedesktop.org]] の変数であり、現在の[[デスクトップ環境]]を識別する文字列のリストをコロンで区切って格納しています [https://specifications.freedesktop.org/mime-apps-spec/1.0.1/ar01s02.html]。活発に開発されている環境の標準的な値は、{{ic|GNOME}}、{{ic|GNOME-Flashback}}、{{ic|KDE}}、{{ic|LXDE}}、{{ic|LXQt}}、{{ic|MATE}}、{{ic|TDE}}、{{ic|Unity}}、{{ic|XFCE}}、{{ic|EDE}}、{{ic|Cinnamon}}、{{ic|Pantheon}}、そして {{ic|DDE}} です [https://specifications.freedesktop.org/menu-spec/latest/apb.html]。
*{{ic|PATH}} はコロンで区切られたディレクトリのリストで、システムが実行ファイルを探す対象となります。通常のコマンド (例: ''pacman'', ''systemctl'' など) をシェルに打ち込むと、このリストにあるディレクトリから同じ名前の実行ファイルが探され、そして実行されます。{{ic|PATH}} に含まれないディレクトリ下のものを実行するには、実行ファイルへの絶対パスが必要です: {{ic|/opt/adobe-air-sdk/bin/adl}}。
 
  +
** [https://bugs.freedesktop.org/show_bug.cgi?id=73497 Cinnamon は他のデスクトップ環境より遅れて登録されました]。そのため、まだ登録前の値 {{ic|X-CINNAMON}} を期待するソフトウェアがあるかもしれません (最近の [[Qt]] バージョン 6.3 など) [https://github.com/qt/qtbase/blob/6.3/src/gui/platform/unix/qgenericunixthemes.cpp#L858]。
  +
** {{ic|Hyprland}} は非公式に [[Hyprland]] として認識されています。
   
  +
* {{ic|XDG_SESSION_DESKTOP}} は {{ic|XDG_CURRENT_DESKTOP}} に似ていますが、単一の文字列しか許可しません。その名前にもかかわらず、[https://gitlab.gnome.org/GNOME/gtk/-/issues/1224#note_270915 これは freedesktop.org によって標準化されていません]。
{{Note|ユーザーが悪意のあるプログラムを実行してしまう可能性があるため、セキュリティ上の理由から {{ic|PATH}} に現在のワーキングディレクトリ {{ic|.}} を含めないことを推奨します。}}
 
   
  +
* {{ic|DE}} は使用中のデスクトップ環境 (''d''esktop ''e''nvironment) を示すレガシー変数です。どのような値を取りうるかについての中心的なドキュメントはありませんが、[[xdg-utils#環境変数|xdg-utils]] は多くのデスクトップ環境についてのリファレンスを提供しています。
*{{ic|HOME}} は現在のユーザーのホームディレクトリが入ります。この変数は、アプリケーションが現在のユーザーに関連した設定ファイル等を見つけるために使われます。
 
   
  +
* {{ic|DESKTOP_SESSION}} もレガシーな変数です。{{ic|DE}} に似ていますが、より一般的ではありません。セッションの ({{ic|/usr/share/xsessions/}} 内の) [[デスクトップエントリ]]へのパスを格納できます [https://github.com/qt/qtbase/blob/6.3/src/gui/platform/unix/qgenericunixservices.cpp#L92-L107]。
*{{ic|PWD}} にはワーキングディレクトリのパスが入ります。
 
   
  +
* {{ic|WINDOW_MANAGER}} は、デスクトップ環境で使用する[[ウィンドウマネージャ]]を''選択''するために時々使われる変数です。他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。
*{{ic|OLDPWD}} には前のワーキングディレクトリのパスが入ります。つまり最後に ''cd'' を実行する前の {{ic|PWD}} です。
 
   
  +
* {{ic|PATH}} には、コロンで区切られたディレクトリのリストが格納されています。システムは、この変数に登録されているディレクトリから実行ファイルを探索します。通常のコマンド (例: ''ls''、''systemctl''、''pacman'') がシェル (''bash'' や ''zsh'' など) によって解釈される際、シェルは {{ic|PATH}} のリスト内のディレクトリからそのコマンドと同じ名前の実行ファイルを探索し、それを実行します。{{ic|PATH}} に含まれないディレクトリにある実行ファイルを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、{{ic|./a.out}} や {{ic|/bin/ls}} です。
*{{ic|SHELL}} には実行中の、インタラクティブシェルの名前が入ります。例: {{ic|bash}}。
 
   
  +
{{Note|セキュリティ上の理由により {{ic|PATH}} にはカレント作業ディレクトリ ({{ic|.}}) を含めないことが推奨されます。ユーザが騙されて、悪意のあるコマンドを実行してしまうかもしれないからです。}}
*{{ic|TERM}} には実行中のターミナルの名前が入ります。例: {{ic|xterm}}。
 
   
*{{ic|PAGER}} にはテキファイルを閲覧するために使われるコマンド入ります。例: {{ic|/bin/less}}
+
* {{ic|HOME}} には現在のユーザのホームディレクトリへのパが格納されます。この変数は、アプリケーションが現在のユーザに関連した設定ファイル見つけるために使うことできます。
   
  +
* {{ic|PWD}} には[[Wikipedia:ja:Pwd|作業ディレクトリへのパス]]が入ります。
*{{ic|EDITOR}} にはテキストファイルを編集するために使われる軽量なエディタのコマンドが入ります。例: {{ic|/usr/bin/nano}}。例えば、以下のようにすることで [[Xorg|X]] 環境下では ''gedit''、そうでなければ ''nano'' を使用するようにできます:
 
   
  +
* {{ic|OLDPWD}} には前のワーキングディレクトリへのパスが入ります。つまり最後に ''cd'' を実行する前の {{ic|PWD}} です。
export EDITOR="$(if <nowiki>[[</nowiki> -n $DISPLAY <nowiki>]]</nowiki>; then echo 'gedit'; else echo 'nano'; fi)"
 
   
  +
* {{ic|TERM}} には、実行中のターミナル (''term''inal) の種類が格納されます (例: {{ic|xterm-256color}})。この変数は、ターミナル固有の機能を期待する、ターミナル内で実行されるプログラムによって使用されます。
*{{ic|VISUAL}} にはメールの編集など、作業量が多いことをするのに使う、フル機能のエディタを実行するコマンドを指定します (例: {{ic|vi}}, [[vim]], [[emacs]] など)。
 
   
*{{ic|MAIL}} には受信したメールの保存場所が入ります。一般的な設定は {{ic|/var/spool/mail/$LOGNAME}} です。
+
* {{ic|MAIL}} には受信したメールの保存場所が入ります。伝統的な設定は {{ic|/var/spool/mail/$LOGNAME}} です。
   
  +
* {{ic|ftp_proxy}} と {{ic|http_proxy}} にはそれぞれ FTP と HTTP プロキシサーバーを記述します:
*{{ic|BROWSER}} にはウェブブラウザのパスを指定します。インタラクティブシェルの設定ファイルで以下のように設定することで、[[Xorg|X]] など、グラフィカル環境が存在するかどうかで動的にウェブブラウザを変更することが可能です:
 
 
if <nowiki>[</nowiki> -n "$DISPLAY" <nowiki>]</nowiki>; then
 
export BROWSER=firefox
 
else
 
export BROWSER=links
 
fi
 
 
*{{ic|ftp_proxy}} と {{ic|http_proxy}} にはそれぞれ FTP と HTTP プロキシサーバーを記述します:
 
 
ftp_proxy="<nowiki>ftp://192.168.0.1:21</nowiki>"
 
ftp_proxy="<nowiki>ftp://192.168.0.1:21</nowiki>"
 
http_proxy="<nowiki>http://192.168.0.1:80</nowiki>"
 
http_proxy="<nowiki>http://192.168.0.1:80</nowiki>"
   
*{{ic|MANPATH}} には ''man'' が man ページを探すときに使うコロン区切りのディレクトリのリストが入ります。
+
* {{ic|MANPATH}} には''man'' が man ページを探ディレクトリのリストがコンマで区切られて格納されます。
   
{{Note|{{ic|/etc/profile}} に "Man is much better than us at figuring this out" (man は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです: {{ic|/usr/share/man:/usr/local/share/man}}。}}
+
{{Note|{{ic|/etc/profile}} に "Man is much better than us at figuring this out" (man は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです {{man|5|manpath}} を参照。}}
   
*{{ic|INFODIR}} には ''info'' コマンドが info ページを探す際に使うコロン区切りのディレクトリのリストが入ります。例: {{ic|/usr/share/info:/usr/local/share/info}}。
+
* {{ic|INFODIR}} には''info'' コマンドが info ページを探ディレクトリのリストがコンマで区切られて格納されます。例: {{ic|/usr/share/info:/usr/local/share/info}}。
   
*{{ic|TZ}} はユーザー別にシステムと違うタイムゾーンを定するために使ことができます。{{ic|/usr/share/zoneinfo/}} に記載されているタイムゾーンを参考にしてください。 例: {{ic|1=TZ="/usr/share/zoneinfo/Pacific/Fiji"}}。
+
* {{ic|TZ}} はユーザにシステムのタイムゾーンは異なるタイムゾーンを定するために使用することができます。{{ic|/usr/share/zoneinfo/}} タイムゾーンが列挙されているので、これリファレンスとして使用することができます (例: {{ic|1=TZ=":/usr/share/zoneinfo/Pacific/Fiji"}})。変数 {{ic|TZ}} に zoneinfo ファイルを指定する場合、[https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html GNU マニュアル] に従ってコロンで始める必要があります
   
 
=== デフォルトプログラム ===
 
=== デフォルトプログラム ===
   
* {{ic|SHELL}} にはユーザの[https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 優先シェル]へのパスが含まれます。[[Bash]] は起動時にこの変数を設定しますがこれは必ずしも現在実行中のシェルではないことに注意してください。
+
* {{ic|SHELL}} にはユーザの[https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 優先シェル]へのパスが含まれます。この変数の値は、現在実行中のシェルである必要はないことに注意してください。この変数に値がない場合、[[Bash]] は自動的に {{ic|/etc/passwd}} で定義されているユーザのログインシェルに設定するか、判断できない場合は {{ic|/bin/sh}} にします
  +
  +
* {{ic|PAGER}} には、ファイルの内容を一覧表示するために使用されるプログラムを実行するコマンドが含まれます。例: {{ic|/bin/less}}。
   
* {{ic|PAGER}} にはファイルの内容を一覧表示するために使用されるプログラムを実行するコマンドが含まれます例: {{ic|/bin/less}}。
+
* {{ic|EDITOR}} にはファイルの編集に使用される軽量プログラムを実行するコマンドが含まれています (例:{{ic|/usr/bin/nano}})例えば、以下の例のように、[[X]] 下では ''gedit'' を使い、それ以外では ''nano'' を使うように設定するインタラクティブスイッチを記述することができます:
   
  +
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
* {{ic|EDITOR}} にはファイルの編集に使用される軽量プログラムを実行するコマンドが含まれています(例:{{ic|/usr/bin/nano}} など)。例えば、この例のように、[[X]] の下の ''gedit''と ''nano'' を対話的に切り替えるように書くことができます。
 
   
  +
* {{ic|VISUAL}} には、メールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています (例: {{ic|vi}}、[[vim]]、[[emacs]] など)。
export EDITOR="$(if <nowiki>[[</nowiki> -n $DISPLAY <nowiki>]]</nowiki>; then echo 'gedit'; else echo 'nano'; fi)"
 
   
  +
* {{ic|BROWSER}} にはウェブブラウザへのパスが含まれています。グラフィカル環境 ([[X]] など) が利用できるかに応じてこの変数を動的に変更するようなコードをインタラクティブシェルの設定ファイルに記述しておくと便利です:
* {{ic|VISUAL}} にはメールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています(例: {{ic|vi}}、[[vim]]、[[emacs]] など)。
 
   
  +
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links
* {{ic|BROWSER}} はウェブブラウザのパスが含まれています。[[X]] などのグラフィック環境に応じて動的に変更できるように、対話型のシェル設定ファイルに書いておくと便利です。
 
   
  +
{{Tip|{{ic|WAYLAND_DISPLAY}} 環境変数を使うことで、[[Wayland#コンポジタ|Wayland コンポジタ]]が実行されているかどうかに応じてこれらのデフォルトプログラムを設定することができます。}}
if <nowiki>[</nowiki> -n "$DISPLAY" <nowiki>]</nowiki>; then
 
export BROWSER=firefox
 
else
 
export BROWSER=links
 
fi
 
   
 
== 参照 ==
 
== 参照 ==
   
* [https://wiki.gentoo.org/wiki/Handbook:X86/Working/EnvVar/ja Gentoo Linux ドキュメント]
+
* [[Gentoo:Handbook:X86/Working/EnvVar]]
* [https://help.ubuntu.com/community/EnvironmentVariables Ubuntu Community Wiki - 環境変数]
+
* [https://help.ubuntu.com/community/EnvironmentVariables Ubuntu Community Wiki - Environment Variables]
   
{{TranslationStatus|Environment variables|2021-12-05|684359}}
+
{{TranslationStatus|Environment variables|2024-08-18|813616}}

2024年8月18日 (日) 11:11時点における最新版

関連記事

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

ユーティリティ

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

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

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

$ env EDITOR=vim xterm

シェルset(1p) 組み込みコマンドを使えば、シェルオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前とその値を出力したりできます。

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

変数の定義

環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや systemd サービスでは、変数を有効にするために特定の場所で設定することが要求されます。環境変数のスコープは、それらが影響を与えるコンテキストに分けられます:

グローバル

シェルの初期化ファイルを使う

大半の Linux ディストリビューションは、あなたに /etc/profile 等のファイルに環境変数の追加・変更を行うよう指示します。また、/etc/locale.conf のような変数設定を含むパッケージ固有の設定ファイルがあることも覚えておいてください。環境変数の維持・管理は必ず行い、環境変数を含むことができる多数のファイルに注意を払うようにしてください。原則的に、あらゆるシェルスクリプトは環境変数の初期化に使うことができますが、以下のような UNIX の慣例に従い特定のファイルでのみ行われるべきです。

以下のファイルは、システムのグローバルな環境変数を定義するために使用できますが、それぞれに異なる制限があります:

  • /etc/environmentpam_env モジュールによって使用され、シェルに依存しないため、スクリプトやグロブ展開は使用できません。このファイルは、変数=値 という形式しか受け入れません。
  • /etc/profile は、ログインシェルのみに対して変数を初期化します。しかし、このファイルはスクリプト (例: /etc/profile.d/ 内にあるファイル) を実行し、すべての Bourne shell 互換シェルで使用することができます。
  • シェル固有の設定ファイル - シェルのグローバルな設定ファイルで、変数の初期化やスクリプトの実行を行います。例えば Bash#設定ファイル (例: ~/.bashrc)) や Zsh#スタートアップ/シャットダウン ファイル (例: ~/.zshrc) です。

以下の例では、複数のディレクトリ (例えば ~/bin~/scripts) をそれぞれのユーザーの PATH に追加する関数を作成しています。これを行うには、以下を任意のグローバル環境変数の設定ファイル (/etc/profile または /etc/bash.bashrc) に記述するだけです:

set_path(){

    # ユーザ ID が 1000 以上であるか確認する
    [ "$(id -u)" -ge 1000 ] || return

    for i in "$@";
    do
        # ディレクトリが存在するか確認する
        [ -d "$i" ] || continue

        # ディレクトリが $PATH に既に存在するか確認する
        echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue

        # ディレクトリを $PATH の末尾に追加し、export する
        export PATH="${PATH}:$i"
    done
}

set_path ~/bin ~/scripts

異なるシェル間で環境変数を共有する1つの方法として、envsubst によって直接読み込むことのできるファイルを、コメント、空行、スペース (bash) を含めずに、作成するというものがあります ([1] から着想を得ました):

.env
EDITOR=vim
XDG_CACHE_HOME=$HOME/.cache
XDG_CONFIG_HOME=$HOME/.config
XDG_DATA_HOME=$HOME/.local/share
XDG_STATE_HOME=$HOME/.local/state
~/bashrc
export $(envsubst < .env)
~/config/fish/config.fish
export (envsubst < .env)

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 を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます:

ローカルで使用するディレクトリを PATH に追加するには、~/.bash_profile に次のように記述します:

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

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

ノート: dbus デーモンや systemd のユーザインスタンスは、~/.bashrc などのような場所で設定された環境変数を継承しません。これはつまり、dbus によってアクティブ化されたプログラム (GNOME Files など) は、そのような変数をデフォルトで使用しないことを意味します。Systemd/ユーザー#環境変数 を参照してください。
ヒント: export -p を実行することで、ユーザセッションに対して宣言されたグローバルな環境変数とローカルな環境変数を見ることができます。

グラフィック環境

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

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

一部のグラフィカル環境 (例えば 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) は、まだこれを直接はサポートしていません。しかし、LightDMSDDM はログインシェルのスタートアップスクリプトを 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 に追加するには、以下を実行してください:

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

シェル固有のディレクトリだけを PATH に追加するには、以下を実行してください:

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

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

  • XDG_CURRENT_DESKTOPfreedesktop.org の変数であり、現在のデスクトップ環境を識別する文字列のリストをコロンで区切って格納しています [4]。活発に開発されている環境の標準的な値は、GNOMEGNOME-FlashbackKDELXDELXQtMATETDEUnityXFCEEDECinnamonPantheon、そして DDE です [5]
  • DE は使用中のデスクトップ環境 (desktop environment) を示すレガシー変数です。どのような値を取りうるかについての中心的なドキュメントはありませんが、xdg-utils は多くのデスクトップ環境についてのリファレンスを提供しています。
  • DESKTOP_SESSION もレガシーな変数です。DE に似ていますが、より一般的ではありません。セッションの (/usr/share/xsessions/ 内の) デスクトップエントリへのパスを格納できます [7]
  • WINDOW_MANAGER は、デスクトップ環境で使用するウィンドウマネージャ選択するために時々使われる変数です。他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。
  • PATH には、コロンで区切られたディレクトリのリストが格納されています。システムは、この変数に登録されているディレクトリから実行ファイルを探索します。通常のコマンド (例: lssystemctlpacman) がシェル (bashzsh など) によって解釈される際、シェルは PATH のリスト内のディレクトリからそのコマンドと同じ名前の実行ファイルを探索し、それを実行します。PATH に含まれないディレクトリにある実行ファイルを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、./a.out/bin/ls です。
ノート: セキュリティ上の理由により PATH にはカレント作業ディレクトリ (.) を含めないことが推奨されます。ユーザが騙されて、悪意のあるコマンドを実行してしまうかもしれないからです。
  • HOME には現在のユーザのホームディレクトリへのパスが格納されます。この変数は、アプリケーションが現在のユーザに関連した設定ファイル等を見つけるために使うことができます。
  • OLDPWD には前のワーキングディレクトリへのパスが入ります。つまり最後に cd を実行する前の PWD です。
  • TERM には、実行中のターミナル (terminal) の種類が格納されます (例: xterm-256color)。この変数は、ターミナル固有の機能を期待する、ターミナル内で実行されるプログラムによって使用されます。
  • 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")。変数 TZ に zoneinfo ファイルを指定する場合、GNU マニュアル に従ってコロンで始める必要があります。

デフォルトプログラム

  • 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 には、メールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています (例: vivimemacs など)。
  • BROWSER にはウェブブラウザへのパスが含まれています。グラフィカル環境 (X など) が利用できるかに応じてこの変数を動的に変更するようなコードをインタラクティブシェルの設定ファイルに記述しておくと便利です:
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links
ヒント: WAYLAND_DISPLAY 環境変数を使うことで、Wayland コンポジタが実行されているかどうかに応じてこれらのデフォルトプログラムを設定することができます。

参照

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