/etc/environment
は公式にはシステム全体の環境変数の正しい場所です。しかし、このファイルの割り当てを再起動や再ログなしでリロードするにはどうすればいいのでしょうか?
興味深いことに十分なgoogleはここで私を助けていません, それはさておき、使用することを示唆しているブログ記事の数十から
source /etc/environment
/etc/environment
は割り当てのリスト (1行に1つ) であり、実行可能なスクリプトではないからです (したがって、/etc/environment
の export
コマンドがないのです)
176 fgysin reinstate Monica 2011-09-25
あなたが勘違いしているのは、/etc/environment
のリロードには再起動が必要だということです。これは正しくありません。ファイルが読み込まれるのはログイン時のみで、PAMスタックが起動されているときです – 具体的にはpam_env.so
で、ファイルを読み込んでいます
これは、「システムを保護する」という意味ではなく、「システムを保護する」という意味では、「システムを保護する」ということになります。他のすべての “ソリューション”2は、単一のシェルプロセスにのみ環境を適用し、新しいターミナルウィンドウを含むGUIから起動したものには適用しません
それでいいならば、しかし – export
コマンドの不足は set -a
と set +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-shell
や openbox
)、タスクバー/パネル(例: 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