題 如何在不重啟的情況下重新加載/ etc / environment?


/etc/environment 是 正式 系統範圍環境變量的正確位置。但我怎麼能 重裝 此文件中的分配沒有重新啟動或重新啟動?

有趣的是,除了數十篇建議使用的博客文章外,谷歌對我沒有幫助

source /etc/environment

這顯然會 永遠不會工作 因為 /etc/environment 是一個分配清單(每行一個)和  一個可執行的腳本(因此缺少 export 命令 /etc/environment ...)。


134
2017-09-25 11:27


起源


全系統,我不知道。對於當前的shell會話,您可以使用 for line in $( cat /etc/environment ) ; do export $line ; done,如果文件格式是 key=value。 - Daniel Beck♦
適合我的工作沒有 export... - Izkata
@lzkata:如果已導出變量,則無需再次導出該變量...如果添加了尚未導出的新變量,則 export 將是必要的...(沒有它,它只是當前shell中的普通非環境變量,在子進程中不可用) - Gert van den Berg
@DanielBeck謝謝..plz添加評論作為答案! - Waleed Gadelkareem
它對debian和centos有效嗎? - Massimo


答案:


你錯的一件事是 /etc/environment 需要重新啟動才能重新加載。這是不正確的。文件讀取的唯一時間是 登錄時,當PAM堆棧被激活時 - 具體而​​言 pam_env.so,讀取文件。

退出並重新登錄將應用更改 - 實際上是您 必須 如果您希望所有進程都接收新環境,請執行此操作。所有其他“解決方案”2 只會將環境應用於單個shell進程,而不是通過GUI啟動的任何內容,包括新的終端窗口。1

如果你對此很好,那麼 - 缺乏 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來調用它 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'}"
()

106
2017-09-25 14:52



我剛剛讀了-r env;做出口“$ env”;在Ubuntu 16.04上完成並且它出錯了。你想要更多細節嗎? - Frank
該 while read 方法從中讀取 stdin,所以你可能想要把東西送到它(例如 cat /etc/environment | while ...)。但這不適用於報價格式的環境文件(key="value") - villasv


這不像接受的答案那麼全面,但是如果你在你的引用中引用了變量 /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


5
2017-08-14 20:12



更短:評估 sed 's/^/export /' /etc/environment - Aaron McMillin
上面的非臨時文件版本: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done - Tim Jones
更短: set -a; source /etc/environment; set +a;。 - ulidtko