Một điều bạn nhầm lẫn là /etc/environment
yêu cầu khởi động lại để tải lại. Điều này là không đúng. Lần duy nhất tệp được đọc là khi đăng nhập , khi ngăn xếp PAM được kích hoạt - cụ thể pam_env.so
là đọc tệp.
Đăng xuất và đăng nhập lại sẽ áp dụng các thay đổi - và trên thực tế bạn phải làm điều này nếu bạn muốn tất cả các quy trình của mình nhận được môi trường mới . Tất cả các "giải pháp" 2 khác sẽ chỉ áp dụng môi trường cho quy trình shell đơn, nhưng không áp dụng cho bất kỳ thứ gì bạn khởi chạy thông qua GUI bao gồm các cửa sổ đầu cuối mới. 1
Tuy nhiên, nếu bạn ổn với điều đó - việc thiếu các export
lệnh có thể được bù bằng set -a
và set +a
. Tuy nhiên, nó vẫn là một cách kém, vì tập tin cũng không sử dụng trích dẫn. Nhưng điều này sẽ hoạt động tốt:
while read -r env; do export "$env"; done
1 Trình quản lý phiên Gnome cung cấp cách thay đổi môi trường của chính nó, nhưng chỉ trong Initialization
giai đoạn:
$ 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
không phải là một giải pháp, nhưng đôi khi có thể được sử dụng. Bạn phải đính kèm nó vào các quy trình đang chạy của trình quản lý phiên (ví dụ gnome-session
), trình quản lý cửa sổ (ví dụ gnome-shell
hoặc openbox
), thanh tác vụ / bảng điều khiển của bạn nếu có (ví dụ xfce4-panel
) và nói chung là bất kỳ thứ gì khác có thể chạy công cụ. Đối với mỗi quy trình đó, bạn cần đính kèm gdb
với nó bằng PID, gọi putenv()
hàm bằng cách sử dụng p
, sau đó tách ra bằng cách sử dụng 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
Lưu ý rằng trình gỡ lỗi tạm dừng quá trình, do đó bạn phải đính kèm để chỉ kết hợp các trình quản lý cửa sổ từ một tty khác (bảng điều khiển ảo) hoặc qua SSH, nếu không màn hình sẽ bị đóng băng.
Ngoài ra, bạn cũng nên cập nhật môi trường được sử dụng bởi dbus-daemon:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
Đối với các hệ thống cũ:
$ gdbus call -e -d org.freedesktop.DBus \
-o /org/freedesktop/DBus \
-m org.freedesktop.DBus.UpdateActivationEnvironment \
"{'FOO': 'bar', 'BAZ': 'qux'}"
()
for line in $( cat /etc/environment ) ; do export $line ; done
, nếu định dạng tệp làkey=value
.