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


157

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

Thật thú vị, google không giúp tôi ở đây, ngoài hàng tá bài đăng trên blog gợi ý sử dụng

source /etc/environment

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


11
Toàn hệ thống, tôi không có ý tưởng. Đối với phiên shell 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

2
Làm việc cho tôi mà không cần export...
Izkata 30/03/2016

2
@lzkata: Nếu một biến đã được xuất, thì không cần phải xuất lại ... Nếu biến mới chưa được xuất được thêm vào, thì exportsẽ là cần thiết ... (nếu không có thì đó chỉ là một biến không bình thường Biến môi trường trong lớp vỏ hiện tại, không có sẵn trong các quy trình con)
Gert van den Berg

@DanielBeck cảm ơn bạn..plz thêm bạn nhận xét như một câu trả lời!
Gadelkareem

Nó cũng hoạt động trên debian và centos?
Massimo

Câu trả lời:


122

Một điều bạn nhầm lẫn là /etc/environmentyê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.solà đọ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 exportlệnh có thể được bù bằng set -aset +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 Initializationgiai đ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-shellhoặ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 gdbvớ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'}"
()

1
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ó bị lỗi. Bạn có muốn biết thêm chi tiết?
Frank

Các while readphương pháp đọc từ stdin, vì vậy bạn có thể muốn ống một cái gì đó với nó (ví dụ cat /etc/environment | while ...). Nhưng điều này sẽ không hoạt động với trích dẫn các tệp môi trường được định dạng ( key="value")
Villasv

6

Điều này không đầy đủ 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/environmenttệp của mình thì cả hai phương thức trước đó (sử dụng export $linecách nào đó) sẽ 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 có khả năng nguồn tạm thời

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


4
Ngắn hơn: evalsed 's/^/export /' /etc/environment
Aaron McMillin

2
Phiên bản không phải 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

7
Thậm chí ngắn hơn : set -a; source /etc/environment; set +a;.
ulidtko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.