再起動せずに/ etc / environmentをリロードする方法は?


157

/etc/environment正式にシステム全体の環境変数のための正しい場所。しかし、再起動または再ログせずにこのファイルの割り当てをリロードするにはどうすればよいですか?

興味深いことに、Googleはここで私を助けてくれません。

source /etc/environment

これは明らかにされます動作しませんので、/etc/environmentassigmentsのリスト(1行に1つずつ)とされていない実行可能スクリプト(したがって、行方不明exportのコマンドを/etc/environment...)。


11
システム全体で、私にはわからない。現在のシェルセッションでfor line in $( cat /etc/environment ) ; do export $line ; doneは、ファイル形式がの場合、を使用できますkey=value
ダニエルベック

2
なしで私の作品export...
Izkata

2
@lzkata:変数が既にエクスポートされている場合、再度エクスポートする必要はありません...まだエクスポートされていない新しい変数が追加さexportれる場合、必要になります...(それなしでは、通常の非子プロセスでは使用できません現在のシェルで-environment変数、)
ゲルトファンデンベルグ

@DanielBeckありがとう。答えとしてコメントを追加してください!
ガデルカリーム

debianとcentosでも動作しますか?
マッシモ

回答:


122

間違っているのは、/etc/environmentリロードするために再起動が必要なことです。これは間違っています。ファイルが読み取られるのは、ログイン時、PAMスタックがアクティブになったとき、特にpam_env.soファイルを読み取るときだけです。

ログアウトして再度ログインすると、変更が適用されます。実際、すべてのプロセスが新しい環境を受け取るようにするには、これを行う必要あります。他のすべての「ソリューション」2は、環境をシングルシェルプロセスにのみ適用しますが、新しいターミナルウィンドウを含むGUIから起動するものには適用しません。1

あなたはそれと罰金している場合は、しかし-の欠如exportのコマンドがで補うことができるset -aset +a。ただし、ファイルも引用符を使用しないため、依然として不十分な方法です。しかし、これはうまくいくはずです:

while read -r env; do export "$env"; done

1 GNOME Session Managerは、自身の環境を変更する方法を提供しますが、Initializationフェーズ中のみです:

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2 gdbは解決策ではありませんが、時々使用できます。セッションマネージャーの実行中のプロセス(例gnome-session)、ウィンドウマネージャー(例:gnome-shellまたはopenbox)、タスクバー/パネル(例:)xfce4-panel、および一般的に何かを実行する可能性のあるその他のものにアタッチする必要があります。これらのプロセスごとにgdb、PIDで接続し、をputenv()使用して関数を呼び出しp、次にを使用してデタッチする必要がありますq

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

デバッガーはプロセスを一時停止するため、別のtty(仮想コンソール)またはSSH経由でのみ合成ウィンドウマネージャーにアタッチする必要があります。そうしないと、画面がフリーズします。

それに加えて、 dbus-daemonが使用する環境も更新する必要があります。

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

古いシステムの場合:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

1
-r envを読みながらテストしました。「$ env」をエクスポートします。Ubuntu 16.04で実行するとエラーが発生します。詳細をご希望ですか?
フランク

while readこの方法から読み取りstdin、あなたはおそらく、パイプに(例えばに何かをしたいですcat /etc/environment | while ...)。しかし、これは引用形式の環境ファイルでは機能しません(key="value"
villasv

6

これは受け入れられた答えほど包括的ではありませんが、/etc/environmentファイルに変数を引用符で囲むと、以前の方法(export $line何らかの方法で使用)の両方が間違ってしまい、引用符で囲まれた値になります。

  • オプション1:ソース可能な一時ファイルを使用する

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • オプション2:インラインでfor(@ tim-jonesに感謝):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


4
短い:evalsed 's/^/export /' /etc/environment
アーロンマクミリン

2
上記の非一時ファイルバージョン:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
ティムジョーンズ

7
さらに短く:set -a; source /etc/environment; set +a;
ulidtko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.