سؤال كيفية إعادة تحميل / الخ / البيئة دون إعادة التشغيل؟


/etc/environment هو بشكل رسمي المكان الصحيح لمتغيرات بيئة النظام على نطاق واسع. لكن كيف يمكنني ذلك إعادة تحميل المهام في هذا الملف دون إعادة التشغيل أو relogging؟

من المفيد بما فيه الكفاية أن google لا تساعدني هنا ، بالإضافة إلى العشرات من مشاركات المدونات التي تشير إلى استخدامها

source /etc/environment

والتي من الواضح سوف لن يعمل ابدا لان /etc/environment هي قائمة من assigments (واحد لكل سطر) و ليس برنامج نصي قابل للتنفيذ (وبالتالي مفقود 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 شكرا لك .. بلز إضافة تعليقك كإجابة! - Waleed Gadelkareem
هل يعمل أيضًا على debian و centos؟ - Massimo


الأجوبة:


شيء واحد كنت مخطئا عنه هو ذلك /etc/environment يتطلب إعادة تشغيل لإعادة تحميل. هذا غير صحيح. المرة الوحيدة التي يقرأ الملف فيها على تسجيل الدخول، عندما يتم تنشيط المكدس PAM - على وجه التحديد pam_env.soالذي يقرأ الملف.

سيؤدي تسجيل الخروج والعودة إلى تطبيق التغييرات - وفي الواقع أنت يجب افعل ذلك إذا كنت تريد أن تتلقى جميع العمليات الخاصة بك البيئة الجديدة. جميع "الحلول" الأخرى2 سيتم تطبيق البيئة على عملية shell الوحيدة ، ولكن ليس على أي شيء تطلقه من خلال واجهة المستخدم الرسومية بما في ذلك النوافذ الطرفية الجديدة.1

إذا كنت بخير مع ذلك ، على الرغم من - عدم وجود export يمكن تعويضها مع الأوامر set -a و set +a. ومع ذلك ، فإنه لا يزال طريقة سيئة ، حيث لا يستخدم الملف اقتباس إما. لكن هذا يجب أن يعمل بشكل جيد:

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

1 جنوم مدير الجلسة يوفر وسيلة لتغيير البيئة الخاصة به ، ولكن فقط خلال 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



لقد اختبرت فقط أثناء قراءة env ؛ لا تصدير "$ env" ؛ القيام به على أوبونتو 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 (شكرا @ تيم جونز):

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


5
2017-08-14 20:12



أقصر: eval 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