सवाल रिबूट किए बिना / etc / पर्यावरण को फिर से लोड कैसे करें?


/etc/environment है आधिकारिक तौर पर सिस्टम विस्तृत पर्यावरण चर के लिए सही जगह। लेकिन मैं कैसे कर सकता हूँ सीमा से अधिक लादना रीबूट या रिगॉगिंग के बिना इस फ़ाइल में असाइनमेंट?

दिलचस्प बात यह है कि उपयोग करने के लिए सुझाव देने वाले ब्लॉग पोस्ट के दर्जनों से अलग Google मेरी मदद नहीं करता है

source /etc/environment

जो स्पष्ट रूप से होगा कभी काम नहीं करो इसलिये /etc/environment assigments की एक सूची है (प्रति पंक्ति एक) और नहीं एक निष्पादन योग्य लिपि (इसलिए गायब export में आदेश /etc/environment ...)।


134
2017-09-25 11:27


मूल


सिस्टमव्यापी, मुझे कोई जानकारी नहीं है। वर्तमान खोल सत्र के लिए, आप इसका उपयोग कर सकते हैं for line in $( cat /etc/environment ) ; do export $line ; done, अगर फ़ाइल प्रारूप है key=value। - Daniel Beck♦
बिना मेरे काम करता है export... - Izkata
@lzkata: यदि एक चर पहले ही निर्यात किया गया है, तो इसे फिर से निर्यात करना आवश्यक नहीं होना चाहिए ... यदि नए चर जो पहले ही निर्यात नहीं किए गए हैं, तो जोड़ा गया है export आवश्यक होगा ... (इसके बिना यह वर्तमान खोल में एक सामान्य गैर-पर्यावरण चर है, बाल प्रक्रियाओं में उपलब्ध नहीं है) - Gert van den Berg
@DanielBeck धन्यवाद ..plz आपको एक उत्तर के रूप में टिप्पणी जोड़ें! - Waleed Gadelkareem
क्या यह डेबियन और सेंटोस पर भी काम करता है? - Massimo


जवाब:


एक चीज जिसे आप गलत समझते हैं वह है /etc/environment पुनः लोड करने के लिए एक रीबूट की आवश्यकता है। यह गलत है। फाइल पढ़ने के लिए एकमात्र समय है लॉगिन पर, जब पीएएम स्टैक सक्रिय होता है - विशेष रूप से pam_env.so, जो फ़ाइल को पढ़ता है।

लॉग आउट करना और वापस आने से परिवर्तन लागू होंगे - और वास्तव में आप जरूर ऐसा करें अगर आप अपनी सभी प्रक्रियाओं को नया वातावरण प्राप्त करना चाहते हैं। अन्य सभी "समाधान"2 केवल एक ही खोल प्रक्रिया में पर्यावरण लागू करेगा, लेकिन नई टर्मिनल विंडो सहित जीयूआई के माध्यम से लॉन्च किए गए किसी भी चीज़ के लिए नहीं।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 पीआईडी ​​द्वारा इसे करने के लिए, आह्वान करें 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

ध्यान दें कि डीबगर प्रक्रिया को रोकता है, इसलिए आपको केवल अन्य टीटीआई (वर्चुअल कंसोल) या एसएसएच से कंपोजिटिंग विंडो मैनेजर को संलग्न करना होगा, अन्यथा स्क्रीन स्थिर हो जाएगी।

इसके अतिरिक्त, आपको डीबीस-डिमन द्वारा उपयोग किए जाने वाले पर्यावरण को भी अपडेट करना चाहिए:

$ 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



मैंने अभी पढ़ा है जबकि read -r 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