Câu hỏi Làm thế nào để tải lại / etc / môi trường mà không cần khởi động lại?


/etc/environment Là chính thức vị trí chính xác cho các biến môi trường rộng của hệ thống. Nhưng làm sao tôi có thể tải lại các bài tập trong tập tin này mà không cần khởi động lại hoặc relogging?

Điều thú vị là google không giúp tôi ở đây, ngoài hàng chục bài đăng trên blog đề xuất sử dụng

source /etc/environment

mà rõ ràng sẽ Không bao giờ làm việc bởi vì /etc/environment là danh sách các assigments (một trên mỗi dòng) và không phải một tập lệnh thực thi (do đó thiếu export lệnh trong /etc/environment ...).


132
2017-09-25 11:27


gốc


Toàn hệ thống, tôi không có ý tưởng. Đối với phiên trình bao hiện tại, bạn có thể sử dụng for line in $( cat /etc/environment ) ; do export $line ; done, nếu định dạng tệp là key=value. - Daniel Beck♦
Làm việc cho tôi mà không cần export... - Izkata
@ lzkata: Nếu một biến đã được xuất, nó sẽ không cần thiết để xuất nó một lần nữa ... Nếu biến mới chưa được xuất sẽ được thêm vào, export sẽ là cần thiết ... (không có nó nó chỉ là một biến môi trường không bình thường trong trình bao hiện tại, không có sẵn trong các tiến trình con) - Gert van den Berg
@DanielBeck cảm ơn bạn..plz thêm bạn bình luận như một câu trả lời! - Waleed Gadelkareem
nó cũng hoạt động trên debian và centos? - Massimo


Các câu trả lời:


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 chính xác. Lần duy nhất tệp được đọc là về đăng nhập, khi ngăn xếp PAM được kích hoạt - cụ thể pam_env.so, đọc tập tin.

Đăng xuất và đăng nhập lại sẽ áp dụng các thay đổi - và thực tế là 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 bạn nhận được môi trường mới. Tất cả "giải pháp" khác2 sẽ chỉ áp dụng môi trường cho quá trình shell đơn, nhưng không áp dụng cho bất cứ thứ gì bạn khởi chạy thông qua GUI bao gồm cả các cửa sổ đầu cuối mới.1

Nếu bạn ổn với điều đó, mặc dù - sự thiếu export lệnh có thể được bù cho set -a và set +a. Tuy nhiên, nó vẫn còn là một cách nghèo nàn, vì tập tin cũng không sử dụng trích dẫn. Nhưng điều này sẽ làm việc tốt:

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

1 Trình quản lý phiên GNOME cung cấp một cách để thay đổi môi trường riêng của 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 của bạn (ví dụ: gnome-session), người quản lý cửa sổ của bạn (ví dụ: gnome-shell hoặc là 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 bất cứ điều gì khác mà có thể sẽ chạy công cụ. Đối với mỗi quy trình đó, bạn cần phải đính kèm gdb với nó bằng PID, gọi putenv() chức năng sử dụng p, sau đó tách bằ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ỡ rối tạm dừng quá trình, do đó bạn phải đính kèm để kết hợp các trình quản lý cửa sổ chỉ từ một tty khác (virtual console) hoặc trên SSH, nếu không màn hình sẽ đóng băng.

Thêm vào đó, 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ũ hơn:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

103
2017-09-25 14:52



Tôi vừa kiểm tra trong khi đọc -r env; làm xuất khẩu "$ env"; thực hiện trên Ubuntu 16.04 và nó lỗi. Bạn có muốn biết thêm chi tiết? - Frank
Các while read phương thức đọc từ stdin, vì vậy bạn có thể muốn đặt một cái gì đó cho nó (ví dụ: cat /etc/environment | while ...). Nhưng điều này sẽ không hoạt động với các tệp môi trường được định dạng báo giá (key="value") - villasv


Đây không phải là toàn diện như câu trả lời được chấp nhận, nhưng nếu bạn đã trích dẫn các biến trong /etc/environment tập tin cả hai phương pháp trước đó (sử dụng export $line bằng cách nào đó) sẽ đi sai và bạn kết thúc với các giá trị được trích dẫn.

  • Tùy chọn 1: với tệp tạm thời có khả năng nguồn

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Tùy chọn 2: với nội tuyến for (cảm ơn @ tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


5
2017-08-14 20:12



Ngắn hơn: eval sed 's/^/export /' /etc/environment - Aaron McMillin
Phiên bản không có tệp tạm thời ở trên: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done - Tim Jones
Thậm chí ngắn hơn: set -a; source /etc/environment; set +a;. - ulidtko