สิ่งหนึ่งที่คุณเข้าใจผิดคือ/etc/environment
ต้องรีบูตเพื่อโหลดซ้ำ สิ่งนี้ไม่ถูกต้อง ครั้งเดียวที่ไฟล์ถูกอ่านเข้าสู่ระบบเมื่อเปิดใช้งานสแต็ค PAM - โดยเฉพาะpam_env.so
ซึ่งอ่านไฟล์
ออกจากระบบและกลับเข้ามาจะใช้การเปลี่ยนแปลง - และในความเป็นจริงคุณจะต้องทำเช่นนี้หากคุณต้องการกระบวนการทั้งหมดของคุณจะได้รับสภาพแวดล้อมใหม่ "โซลูชั่น" อื่น ๆ ทั้งหมด2จะใช้สภาพแวดล้อมกับกระบวนการเชลล์เดี่ยวเท่านั้น แต่จะไม่ใช้กับสิ่งที่คุณเรียกใช้ผ่าน 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'}"
()
for line in $( cat /etc/environment ) ; do export $line ; done
key=value