ubuntu – どのように再起動せずに/etc/environmentをリロードするのですか?

environment-variables ubuntu

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

興味深いことに十分なgoogleはここで私を助けていません, それはさておき、使用することを示唆しているブログ記事の数十から

source /etc/environment

/etc/environment は割り当てのリスト (1行に1つ) であり、実行可能なスクリプトではないからです (したがって、/etc/environmentexport コマンドがないのです)

  176  fgysin reinstate Monica  2011-09-25


ベストアンサー

あなたが勘違いしているのは、/etc/environmentのリロードには再起動が必要だということです。これは正しくありません。ファイルが読み込まれるのはログイン時のみで、PAMスタックが起動されているときです – 具体的にはpam_env.soで、ファイルを読み込んでいます

これは、「システムを保護する」という意味ではなく、「システムを保護する」という意味では、「システムを保護する」ということになります。他のすべての “ソリューション”2は、単一のシェルプロセスにのみ環境を適用し、新しいターミナルウィンドウを含むGUIから起動したものには適用しません

それでいいならば、しかし – export コマンドの不足は set -aset +a で補うことができます。しかし、ファイルが引用符を使っていないので、相変わらず貧弱な方法であることに変わりはありません。しかし、これはうまくいくはずです

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

1 GNOME セッションマネージャは自身の環境を変更する方法を提供していますが、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-shellopenbox)、タスクバー/パネル(例: xfce4-panel)、そして一般的に何かを実行している可能性のあるプロセスにアタッチしなければなりません。それぞれのプロセスに対して、gdb を PID でアタッチし、p を使って putenv() 関数を呼び出し、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'}"
()

130  user1686  2011-09-25


これは、受け入れられている答えほど包括的ではありませんが、/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

7  villasv  2017-08-14


タイトルとURLをコピーしました