/etc/environment
は 正式に システム全体の環境変数の正しい場所です。しかし、再起動や再ログインをせずに、このファイルの割り当てをIreloadとするとどうなりますか。
興味深いことに、十分な数のグーグルがここで私を助けてくれません。
source /etc/environment
/etc/environment
は割り当てのリスト(1行に1つ)であり、notは実行可能スクリプトであるため、これは明らかに動作しません(そのため、/etc/environment
にexport
コマンドがありません...)。
間違っているのは、/etc/environment
をリロードするには再起動が必要なことです。これは間違っています。ファイルが読み込まれるのはログイン時のみです。これは、PAMスタックがアクティブになったとき、具体的にはpam_env.so
で、ファイルを読み込みます。
ログアウトして再度ログインすると、変更が適用されます。実際、mustすべてのプロセスで新しい環境を受信する場合はこれを行ってください。他のすべての「ソリューション」2 環境は単一のシェルプロセスにのみ適用され、新しいターミナルウィンドウを含むGUIから起動するものには適用されません。1
ただし、それで問題ない場合は、export
コマンドの欠如をset -a
およびset +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でアタッチし、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'}"
()
これは一般的な回答ほど包括的ではありませんが、/etc/environment
ファイルで変数を引用符で囲んだ場合、以前の方法(export $line
を使用する方法)はどちらもうまくいかず、引用符で囲まれた値になります。
sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh
for
を使う(ありがとう@ tim-jones):for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done