「環境変数」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→サンプル: 行削除) |
(→pam_env を使う: 翻訳を修正) |
||
(2人の利用者による、間の13版が非表示) | |||
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 つ以上のアプリケーションによって使用されるデータを含む名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値は |
+ | 環境変数とは 1 つ以上のアプリケーションによって使用されるデータを含む名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値としては、実行可能ファイルのファイルシステムにおける場所や使用するデフォルトのエディタ、システムロケールの設定などがあります。Linux に慣れてないユーザーは、環境変数で設定をするのは御しがたいと考えがちです。しかし、環境変数は、Linux で複数のアプリケーションとプロセスの間で設定を共有するためのシンプルな方法を提供してくれます。 |
== ユーティリティ == |
== ユーティリティ == |
||
− | {{Pkg|coreutils}} パッケージには ''printenv'' と ''env'' というプログラムが |
+ | {{Pkg|coreutils}} パッケージには ''printenv'' と ''env'' というプログラムが含まれています。現在の環境変数とその値を一覧表示するには: |
$ printenv |
$ printenv |
||
− | {{Note|環境変数の中にはユーザ |
+ | {{Note|環境変数の中にはユーザ個別のものも存在します。''printenv'' の出力を非特権ユーザの場合と ''root'' ユーザの場合で比較して確認してください。}} |
− | + | ''env'' ユーティリティを使うことで、環境変数を変更してコマンドを実行することができます。以下の例では、環境変数 {{ic|EDITOR}} を {{ic|vim}} に設定して ''xterm'' を起動します。以下のコマンドを実行しても、グローバルな {{ic|EDITOR}} 変数には影響を与えません。 |
|
$ env EDITOR=vim xterm |
$ env EDITOR=vim xterm |
||
− | [[ |
+ | [[シェル]] の {{man|1p|set}} 組み込みコマンドを使えば、シェルオプションの値を変更したり、位置のパラメータを設定したり、シェル変数の名前とその値を出力したりできます。 |
− | 各プロセスは環境を {{ic|/proc/$PID/environ}} ファイルに保存します。このファイルには、ヌル文字 ({{ic|\x0}}) で区切られた |
+ | 各プロセスはその環境変数を {{ic|/proc/$PID/environ}} ファイルに保存しています。このファイルには、ヌル文字 ({{ic|\x0}}) で区切られたキーと値のペアが含まれています。[[sed]] を使用すると、より読み易い形式で取得できます。例: {{ic|sed 's:\x0:\n:g' /proc/$PID/environ}}。 |
== 変数の定義 == |
== 変数の定義 == |
||
− | 環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや systemd サービスでは、変数を有効にするために特定の場所 |
+ | 環境を不必要に汚染しないために、変数のスコープを制限するように努めるべきです。実際、グラフィカルセッションや systemd サービスでは、変数を有効にするために特定の場所で設定することが要求されます。環境変数のスコープは、それらが影響を与えるコンテキストに分けられます: |
− | * [[#グローバル|グローバル]]: あらゆるユーザ |
+ | * [[#グローバル|グローバル]]: あらゆるユーザが実行する全プログラム。Systemd サービスは含まれません。 |
− | * [[#ユーザーごと|ユーザ |
+ | * [[#ユーザーごと|ユーザ別]]: 特定のユーザが実行する全プログラム。Systemd ユーザサービス ([[Systemd/ユーザー#環境変数]] を参照) やグラフィカルアプリケーション ([[#グラフィック環境]] を参照) は含まれません。 |
=== グローバル === |
=== グローバル === |
||
− | ==== シェルの初期化ファイル |
+ | ==== シェルの初期化ファイルを使う ==== |
− | 大半の Linux ディストリビューションは、あなたに {{ic|/etc/profile}} 等のファイルに環境変数の追加・変更を行うよう指示します。また、{{ic|/etc/locale.conf}} のような変数設定を含むパッケージ固有の設定ファイルがあることも覚えておいてください。環境変数の維持・管理は必ず行い、環境変数を含むことができる多数のファイルに注意を払うようにしてください。原則的にあらゆるシェルスクリプトは環境変数の |
+ | 大半の Linux ディストリビューションは、あなたに {{ic|/etc/profile}} 等のファイルに環境変数の追加・変更を行うよう指示します。また、{{ic|/etc/locale.conf}} のような変数設定を含むパッケージ固有の設定ファイルがあることも覚えておいてください。環境変数の維持・管理は必ず行い、環境変数を含むことができる多数のファイルに注意を払うようにしてください。原則的に、あらゆるシェルスクリプトは環境変数の初期化に使うことができますが、以下のような UNIX の慣例に従い特定のファイルでのみ行われるべきです。 |
− | + | 以下のファイルは、システムのグローバルな環境変数を定義するために使用できますが、それぞれに異なる制限があります: |
|
− | *{{ic|/etc/environment}} |
+ | * {{ic|/etc/environment}} は [[#pam_env を使う|pam_env モジュール]]によって使用され、シェルに依存しないため、スクリプトやグロブ展開は使用できません。このファイルは、{{ic|1=''変数=値''}} という形式しか受け入れません。 |
− | *{{ic|/etc/profile}} |
+ | * {{ic|/etc/profile}} は、ログインシェル''のみ''に対して変数を初期化します。しかし、このファイルはスクリプト (例: {{ic|/etc/profile.d/}} 内にあるファイル) を実行し、すべての [[wikipedia:ja:Bourne Shell|Bourne shell]] 互換シェルで使用することができます。 |
− | * シェル固有の設定ファイル - |
+ | * シェル固有の設定ファイル - [[シェル]]のグローバルな設定ファイルで、変数の初期化やスクリプトの実行を行います。例えば [[Bash#設定ファイル]] (例: {{ic|~/.bashrc}})) や [[Zsh#スタートアップ/シャットダウン ファイル]] (例: {{ic|~/.zshrc}}) です。 |
− | 以下の例では、複数のディレクトリ (例えば {{ic|~/bin}} |
+ | 以下の例では、複数のディレクトリ (例えば {{ic|~/bin}} と {{ic|~/scripts}}) をそれぞれのユーザーの {{ic|PATH}} に追加する関数を作成しています。これを行うには、以下を任意のグローバル環境変数の設定ファイル ({{ic|/etc/profile}} または {{ic|/etc/bash.bashrc}}) に記述するだけです: |
{{bc|<nowiki> |
{{bc|<nowiki> |
||
set_path(){ |
set_path(){ |
||
− | # |
+ | # ユーザ ID が 1000 以上であるか確認する |
[ "$(id -u)" -ge 1000 ] || return |
[ "$(id -u)" -ge 1000 ] || return |
||
for i in "$@"; |
for i in "$@"; |
||
do |
do |
||
+ | # ディレクトリが存在するか確認する |
||
− | # Check if the directory exists |
||
[ -d "$i" ] || continue |
[ -d "$i" ] || continue |
||
+ | # ディレクトリが $PATH に既に存在するか確認する |
||
− | # Check if it is not already in your $PATH. |
||
echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue |
echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue |
||
− | # |
+ | # ディレクトリを $PATH の末尾に追加し、export する |
export PATH="${PATH}:$i" |
export PATH="${PATH}:$i" |
||
done |
done |
||
68行目: | 70行目: | ||
set_path ~/bin ~/scripts |
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}} [[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|/etc/environment}} では、{{ic|1=''変数''=''値''}} というペアを1行に1つずつ記述しなければなりません。例: |
EDITOR=nano |
EDITOR=nano |
||
− | {{ic|/etc/security/pam_env.conf}} は以下の |
+ | {{ic|/etc/security/pam_env.conf}} は以下の形式で記述します: |
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}} 環境変数を別の変数に展開する方法を示しています: |
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''} }} を使って、既に定義されている変数を他の変数の値で展開することができます。例えば: |
GOPATH DEFAULT=${XDG_DATA_HOME}/go |
GOPATH DEFAULT=${XDG_DATA_HOME}/go |
||
102行目: | 118行目: | ||
環境変数をグローバルに定義したくないという時もあるでしょう。例えば、{{ic|PATH}} に {{ic|/home/my_user/bin}} を追加したいが、システム上の他のユーザーには同じ {{ic|PATH}} を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます: |
環境変数をグローバルに定義したくないという時もあるでしょう。例えば、{{ic|PATH}} に {{ic|/home/my_user/bin}} を追加したいが、システム上の他のユーザーには同じ {{ic|PATH}} を使って欲しくないという場合が考えられます。様々なファイルを使うことでローカルに環境変数を定義することができます: |
||
− | * シェルの設定ファイル |
+ | * [[シェル]]のユーザ設定ファイル。例えば、[[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}} に記述します: |
||
109行目: | 126行目: | ||
export PATH="${PATH}:/home/my_user/bin" |
export PATH="${PATH}:/home/my_user/bin" |
||
− | 変数をアップデートするために、再ログインするかファイルを |
+ | 変数をアップデートするために、再ログインするかファイルを [[source]] してください: {{ic|$ source ~/.bash_profile}}。 |
− | {{Note|dbus デーモンや systemd のユーザ |
+ | {{Note|dbus デーモンや systemd のユーザインスタンスは、{{ic|~/.bashrc}} などのような場所で設定された環境変数を継承しません。これはつまり、dbus によってアクティブ化されたプログラム ([[GNOME Files]] など) は、そのような変数をデフォルトで使用しないことを意味します。[[Systemd/ユーザー#環境変数]] を参照してください。}} |
+ | {{Tip|{{ic|export -p}} を実行することで、ユーザセッションに対して宣言されたグローバルな環境変数とローカルな環境変数を見ることができます。}} |
||
− | ==== グラフィック環境変数 ==== |
||
+ | ==== グラフィック環境 ==== |
||
− | 環境変数がグラフィカルなアプリケーションにしか影響しない場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。スコープの降順: |
||
+ | |||
+ | 環境変数がグラフィカルなアプリケーションにしか影響しない場合は、グラフィカルセッション内でのみ設定することにより、その範囲を制限することができます。スコープを大きい順に並べると: |
||
* [[#Xorg セッションごと]] および [[#Wayland セッションごと]] - DE を含むグラフィカルセッション全体に影響します。 |
* [[#Xorg セッションごと]] および [[#Wayland セッションごと]] - DE を含むグラフィカルセッション全体に影響します。 |
||
− | * [[#デスクトップ環境セッションごと]] - グラフィカルセッション内で生成されたアプリケーションに影響を与え |
+ | * [[#デスクトップ環境セッションごと]] - グラフィカルセッション内で生成されたアプリケーションに影響を与えます。DE 自体にも影響を与える可能性があります。 |
* [[#アプリケーションごと]] - 特定のグラフィカル アプリケーションだけに影響します。 |
* [[#アプリケーションごと]] - 特定のグラフィカル アプリケーションだけに影響します。 |
||
===== デスクトップ環境セッションごと ===== |
===== デスクトップ環境セッションごと ===== |
||
− | + | 一部のグラフィカル環境 (例えば [[KDE Plasma]]) は、ログイン時のシェルスクリプト実行をサポートしており、環境変数の設定に利用することができます。例としては [[KDE#自動起動]] を参照してください。 |
|
===== Xorg セッションごと ===== |
===== Xorg セッションごと ===== |
||
− | Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります |
+ | Xorg セッションの環境を変更する手順は、Xorg セッションの起動方法によって異なります: |
− | * ほとんどの |
+ | * ほとんどの[[ディスプレイマネージャ]]は [[xprofile]] を読み込みます。 |
* [[startx]] と [[SLiM]] は [[xinitrc]] を実行します。 |
* [[startx]] と [[SLiM]] は [[xinitrc]] を実行します。 |
||
* [[XDM]] は {{ic|~/.xsession}} を実行します: [[XDM#セッションの定義]] を参照して下さい。 |
* [[XDM]] は {{ic|~/.xsession}} を実行します: [[XDM#セッションの定義]] を参照して下さい。 |
||
+ | * [[SDDM]] は、追加でログインシェルのスタートアップスクリプト ([[Bash]] の場合は {{ic|~/.bash_profile}}、[[Zsh]] のの場合は {{ic|~/.zlogin}}) も読み込みます。[https://github.com/sddm/sddm/blob/master/data/scripts/Xsession] |
||
− | スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です |
+ | スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です: |
{{hc|~/.xprofile, ~/.xinitrc, or ~/.xsession|2= |
{{hc|~/.xprofile, ~/.xinitrc, or ~/.xsession|2= |
||
142行目: | 162行目: | ||
===== Wayland セッションごと ===== |
===== Wayland セッションごと ===== |
||
− | [[Wayland]] は Xorg 関連のファイルを起動しないので、[[GDM]] と [[KDE Plasma]] |
+ | [[Wayland]] は Xorg 関連のファイルを起動しないので、[[GDM]] と [[KDE Plasma]] は代わりに [[systemd/ユーザー#環境変数|systemd ユーザ環境変数]]を読み込みます。 |
{{hc|~/.config/environment.d/envvars.conf|2= |
{{hc|~/.config/environment.d/envvars.conf|2= |
||
148行目: | 168行目: | ||
}} |
}} |
||
− | Wayland セッションをサポートする他のディスプレイマネージャ([[SDDM]] |
+ | Wayland セッションをサポートする他のディスプレイマネージャ (例: [[SDDM]]) は、まだこれを直接はサポートしていません。しかし、[[SDDM]] はログインシェルのスタートアップスクリプトを Wayland セッションでも読み込みます。 |
+ | |||
+ | {{ic|~/.bash_profile}} などのスタートアップスクリプトを読み込むディスプレイマネージャを使用していて、{{ic|environment.d}} を使用したい場合、以下のように読み込むことができます: |
||
+ | |||
+ | {{hc|~/.bash_profile| |
||
+ | # systemd-environment-d-generator(8) を使って環境を生成し、変数を export する |
||
+ | export $(run-parts /usr/lib/systemd/user-environment-generators {{!}} xargs) |
||
+ | }} |
||
+ | |||
+ | {{Note|上記のコードは {{ic|/usr/lib/systemd/user-environment-generators}} 内の全ての実行ファイルを実行します。これは、望ましくない場合があります。代わりに {{ic|/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator}} を直接実行することもできます。}} |
||
===== アプリケーションごと ===== |
===== アプリケーションごと ===== |
||
154行目: | 183行目: | ||
セッション全体ではなく、特定のアプリケーションにのみ環境変数を設定するには、そのアプリケーションの ''.desktop'' ファイルを編集してください。その方法は [[デスクトップエントリ#環境変数の変更]] を参照してください。 |
セッション全体ではなく、特定のアプリケーションにのみ環境変数を設定するには、そのアプリケーションの ''.desktop'' ファイルを編集してください。その方法は [[デスクトップエントリ#環境変数の変更]] を参照してください。 |
||
− | [[Steam]] ゲームでは、起動オプションを編集することでプログラムの環境を設定することができます。[[Steam#起動オプション]]を参照してください。 |
+ | [[Steam]] ゲームでは、起動オプションを編集することでプログラムの環境を設定することができます。[[Steam#起動オプション]] を参照してください。 |
− | === セッションごと === |
+ | === セッションまたはシェルごと === |
− | 時として |
+ | 時として、一時的な変数のみが必要である場合もあります。作成した特定のディレクトリ内の実行ファイルを実行する際に一時的に絶対パスを入力する手間を省きたい場合や、一時的な短いシェルスクリプトでそのパスを使用したい場合があるでしょう。 |
− | + | 例えば、現在のシェルに {{ic|PATH}} 変数を定義できますし、あるいは ''export'' コマンドを使えばセッションからログアウトするまで全てのシェルで有効な {{ic|PATH}} 変数を定義することもできます。セッション固有のディレクトリを {{ic|PATH}} に追加するには、以下を実行してください: |
|
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin" |
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin" |
||
+ | シェル固有のディレクトリだけを {{ic|PATH}} に追加するには、以下を実行してください: |
||
− | == サンプル == |
||
+ | $ PATH="${PATH}:/home/my_user/tmp/usr/bin" |
||
+ | |||
+ | == 例 == |
||
+ | |||
以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。 |
以下のセクションでは Linux システムで一般的に使われている環境変数を並べており、それぞれの値について説明しています。 |
||
− | * {{ic|XDG_CURRENT_DESKTOP}} は [[freedesktop.org]] の変数で、現在の |
+ | * {{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]。 |
− | ** [https://bugs.freedesktop.org/show_bug.cgi?id=73497 Cinnamon は他のデスクトップ環境より遅れて登録されました]。そのため |
+ | ** [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|XDG_SESSION_DESKTOP}} は {{ic|XDG_CURRENT_DESKTOP}} に似ていますが、 |
+ | * {{ic|XDG_SESSION_DESKTOP}} は {{ic|XDG_CURRENT_DESKTOP}} に似ていますが、単一の文字列しか許可しません。その名前にもかかわらず、[https://gitlab.gnome.org/GNOME/gtk/-/issues/1224#note_270915 これは freedesktop.org によって標準化されていません]。 |
− | * {{ic|DE}} は使用中の ''d''esktop ''e''nvironment を示すレガシー変数です。どのような値 |
+ | * {{ic|DE}} は使用中のデスクトップ環境 (''d''esktop ''e''nvironment) を示すレガシー変数です。どのような値を取りうるかについての中心的なドキュメントはありませんが、[[xdg-utils#環境変数|xdg-utils]] は多くのデスクトップ環境についてのリファレンスを提供しています。 |
+ | * {{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|DESKTOP_SESSION}} は {{ic|DE}} と似ていますが、[[LXDE]] デスクトップ環境で使われています: {{ic|DESKTOP_SESSION}} が {{ic|LXDE}} に設定されている場合、''xdg-open'' は ''pcmanfm'' のファイル関連付けを使います。 |
||
− | * {{ic|WINDOW_MANAGER}} は、デスクトップ環境で使用する |
+ | * {{ic|WINDOW_MANAGER}} は、デスクトップ環境で使用する[[ウィンドウマネージャ]]を''選択''するために時々使われる変数です。他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。 |
− | *{{ic|PATH}} はコロンで区切られたディレクトリのリスト |
+ | * {{ic|PATH}} には、コロンで区切られたディレクトリのリストが格納されています。システムは、この変数に登録されているディレクトリから実行ファイルを探索します。通常のコマンド (例: ''ls''、''systemctl''、''pacman'') がシェル (''bash'' や ''zsh'' など) によって解釈される際、シェルは {{ic|PATH}} のリスト内のディレクトリからそのコマンドと同じ名前の実行ファイルを探索し、それを実行します。{{ic|PATH}} に含まれないディレクトリにある実行ファイルを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、{{ic|./a.out}} や {{ic|/bin/ls}} です。 |
− | {{Note| |
+ | {{Note|セキュリティ上の理由により {{ic|PATH}} にはカレント作業ディレクトリ ({{ic|.}}) を含めないことが推奨されます。ユーザが騙されて、悪意のあるコマンドを実行してしまうかもしれないからです。}} |
− | *{{ic|HOME}} は現在のユーザ |
+ | * {{ic|HOME}} には現在のユーザのホームディレクトリへのパスが格納されます。この変数は、アプリケーションが現在のユーザに関連した設定ファイル等を見つけるために使うことができます。 |
− | *{{ic|PWD}} には |
+ | * {{ic|PWD}} には[[Wikipedia:ja:Pwd|作業ディレクトリへのパス]]が入ります。 |
− | *{{ic|OLDPWD}} には前のワーキングディレクトリのパスが入ります。つまり最後に ''cd'' を実行する前の {{ic|PWD}} です。 |
+ | * {{ic|OLDPWD}} には前のワーキングディレクトリへのパスが入ります。つまり最後に ''cd'' を実行する前の {{ic|PWD}} です。 |
− | *{{ic|TERM}} には実行中のターミナルの |
+ | * {{ic|TERM}} には、実行中のターミナル (''term''inal) の種類が格納されます (例: {{ic|xterm-256color}})。この変数は、ターミナル固有の機能を期待する、ターミナル内で実行されるプログラムによって使用されます。 |
− | *{{ic|MAIL}} には受信したメールの保存場所が入ります。 |
+ | * {{ic|MAIL}} には、受信したメールの保存場所が入ります。伝統的な設定は {{ic|/var/spool/mail/$LOGNAME}} です。 |
− | *{{ic|ftp_proxy}} と {{ic|http_proxy}} にはそれぞれ FTP と HTTP プロキシサーバーを記述します: |
+ | * {{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}} には |
+ | * {{ic|MANPATH}} には、''man'' が man ページを探索するディレクトリのリストがコンマで区切られて格納されます。 |
{{Note|{{ic|/etc/profile}} に "Man is much better than us at figuring this out" (man は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです。 {{man|5|manpath}} を参照。}} |
{{Note|{{ic|/etc/profile}} に "Man is much better than us at figuring this out" (man は我々よりずっと上手くこれを解決する) と書いてあるとおり、一般的にこの変数はデフォルトのままにしておくべきです。 {{man|5|manpath}} を参照。}} |
||
− | *{{ic|INFODIR}} |
+ | * {{ic|INFODIR}} には、''info'' コマンドが info ページを探索するディレクトリのリストがコンマで区切られて格納されます。例: {{ic|/usr/share/info:/usr/local/share/info}}。 |
− | *{{ic|TZ}} はユーザ |
+ | * {{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}} にはユーザ |
+ | * {{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}} |
+ | * {{ic|EDITOR}} には、ファイルの編集に使用される軽量プログラムを実行するコマンドが含まれています (例:{{ic|/usr/bin/nano}})。例えば、以下の例のように、[[X]] 下では ''gedit'' を使い、それ以外では ''nano'' を使うように設定するインタラクティブスイッチを記述することができます: |
− | + | [ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano |
|
− | * {{ic|VISUAL}} にはメールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています(例: {{ic|vi}}、[[vim]]、[[emacs]] など)。 |
+ | * {{ic|VISUAL}} には、メールの編集などより高度な作業に使われる本格的なエディタを実行するコマンドが含まれています (例: {{ic|vi}}、[[vim]]、[[emacs]] など)。 |
− | * {{ic|BROWSER}} はウェブブラウザのパスが含まれています。[[X]] など |
+ | * {{ic|BROWSER}} にはウェブブラウザへのパスが含まれています。グラフィカル環境 ([[X]] など) が利用できるかに応じてこの変数を動的に変更するようなコードをインタラクティブシェルの設定ファイルに記述しておくと便利です: |
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links |
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links |
||
− | {{Tip| |
+ | {{Tip|{{ic|WAYLAND_DISPLAY}} 環境変数を使うことで、[[Wayland#コンポジタ|Wayland コンポジタ]]が実行されているかどうかに応じてこれらのデフォルトプログラムを設定することができます。}} |
== 参照 == |
== 参照 == |
||
* [[Gentoo:Handbook:X86/Working/EnvVar]] |
* [[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| |
+ | {{TranslationStatus|Environment variables|2023-06-04|779961}} |
2024年1月17日 (水) 17:11時点における版
環境変数とは 1 つ以上のアプリケーションによって使用されるデータを含む名前付きオブジェクトです。簡単に言えば、名前と値がある変数です。環境変数の値としては、実行可能ファイルのファイルシステムにおける場所や使用するデフォルトのエディタ、システムロケールの設定などがあります。Linux に慣れてないユーザーは、環境変数で設定をするのは御しがたいと考えがちです。しかし、環境変数は、Linux で複数のアプリケーションとプロセスの間で設定を共有するためのシンプルな方法を提供してくれます。
目次
ユーティリティ
coreutils パッケージには printenv と env というプログラムが含まれています。現在の環境変数とその値を一覧表示するには:
$ printenv
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
) です。
以下の例では、複数のディレクトリ (例えば ~/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
の順です。
/etc/environment
では、変数=値
というペアを1行に1つずつ記述しなければなりません。例:
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#セッションの定義 を参照して下さい。 - SDDM は、追加でログインシェルのスタートアップスクリプト (Bash の場合は
~/.bash_profile
、Zsh のの場合は~/.zlogin
) も読み込みます。[2]
スクリプトの終わりはどのファイルであるかに依存し、高度な構文は使用するシェルに依存しますが、基本的な使い方は普遍的です:
~/.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) は、まだこれを直接はサポートしていません。しかし、SDDM はログインシェルのスタートアップスクリプトを Wayland セッションでも読み込みます。
~/.bash_profile
などのスタートアップスクリプトを読み込むディスプレイマネージャを使用していて、environment.d
を使用したい場合、以下のように読み込むことができます:
~/.bash_profile
# systemd-environment-d-generator(8) を使って環境を生成し、変数を export する export $(run-parts /usr/lib/systemd/user-environment-generators | xargs)
アプリケーションごと
セッション全体ではなく、特定のアプリケーションにのみ環境変数を設定するには、そのアプリケーションの .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_DESKTOP
は freedesktop.org の変数であり、現在のデスクトップ環境を識別する文字列のリストをコロンで区切って格納しています [3]。活発に開発されている環境の標準的な値は、GNOME
、GNOME-Flashback
、KDE
、LXDE
、LXQt
、MATE
、TDE
、Unity
、XFCE
、EDE
、Cinnamon
、Pantheon
、そしてDDE
です [4]。- Cinnamon は他のデスクトップ環境より遅れて登録されました。そのため、まだ登録前の値
X-CINNAMON
を期待するソフトウェアがあるかもしれません (最近の Qt バージョン 6.3 など) [5]。
- Cinnamon は他のデスクトップ環境より遅れて登録されました。そのため、まだ登録前の値
XDG_SESSION_DESKTOP
はXDG_CURRENT_DESKTOP
に似ていますが、単一の文字列しか許可しません。その名前にもかかわらず、これは freedesktop.org によって標準化されていません。
DE
は使用中のデスクトップ環境 (desktop environment) を示すレガシー変数です。どのような値を取りうるかについての中心的なドキュメントはありませんが、xdg-utils は多くのデスクトップ環境についてのリファレンスを提供しています。
DESKTOP_SESSION
もレガシーな変数です。DE
に似ていますが、より一般的ではありません。セッションの (/usr/share/xsessions/
内の) デスクトップエントリへのパスを格納できます [6]。
WINDOW_MANAGER
は、デスクトップ環境で使用するウィンドウマネージャを選択するために時々使われる変数です。他のプログラムが読み取るために、既に選択されているディスプレイマネージャやデスクトップ環境によって設定される他の変数とは対照的です。
PATH
には、コロンで区切られたディレクトリのリストが格納されています。システムは、この変数に登録されているディレクトリから実行ファイルを探索します。通常のコマンド (例: ls、systemctl、pacman) がシェル (bash や zsh など) によって解釈される際、シェルはPATH
のリスト内のディレクトリからそのコマンドと同じ名前の実行ファイルを探索し、それを実行します。PATH
に含まれないディレクトリにある実行ファイルを実行するには、実行ファイルへの相対パスや絶対パスを指定する必要があります。例えば、./a.out
や/bin/ls
です。
HOME
には現在のユーザのホームディレクトリへのパスが格納されます。この変数は、アプリケーションが現在のユーザに関連した設定ファイル等を見つけるために使うことができます。
PWD
には作業ディレクトリへのパスが入ります。
OLDPWD
には前のワーキングディレクトリへのパスが入ります。つまり最後に cd を実行する前のPWD
です。
TERM
には、実行中のターミナル (terminal) の種類が格納されます (例:xterm-256color
)。この変数は、ターミナル固有の機能を期待する、ターミナル内で実行されるプログラムによって使用されます。
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 は自動的に/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