रिबूट करने के बिना पुनः लोड / आदि / पर्यावरण कैसे करें?


157

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

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

source /etc/environment

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


11
सिस्टमवाइड, मुझे कोई पता नहीं है। वर्तमान शेल सत्र के लिए, आप उपयोग कर सकते हैं for line in $( cat /etc/environment ) ; do export $line ; done, यदि फ़ाइल प्रारूप है key=value
डैनियल बेक

2
मेरे लिए बिना काम करता है export...
इज़्काटा

2
@lzkata: यदि एक चर पहले से ही निर्यात किया गया है, तो इसे फिर से निर्यात करना आवश्यक नहीं होना चाहिए ... यदि नया चर जो पहले से निर्यात नहीं किया गया है, जोड़ा जाता है, exportआवश्यक होगा ... (इसके बिना यह सिर्फ एक सामान्य गैर है -वर्तमान शेल में वेरिएंट वेरिएबल, चाइल्ड प्रोसेस में उपलब्ध नहीं)
गर्ट वैन डेन बर्ग

@DanielBeck धन्यवाद..प्लस जोड़ने के लिए आप एक जवाब के रूप में टिप्पणी!
गडेलकेरेम

यह डेबियन और सेंटो पर भी काम करता है?
मासिमो

जवाबों:


122

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

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

ध्यान दें कि डिबगर प्रक्रिया को रोक देता है, इसलिए आपको विंडो प्रबंधकों को केवल एक अन्य 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'}"
()

1
मैंने अभी पढ़ा है -r env; निर्यात "$ env"; उबंटू 16.04 पर किया गया और इसमें त्रुटियाँ हैं। क्या आप अधिक विवरण चाहेंगे?
फ्रैंक

while readविधि से पढ़ता है stdin, तो आप शायद पाइप के लिए यह (उदाहरण के लिए के लिए कुछ करना चाहता हूँ cat /etc/environment | while ...)। लेकिन यह key="value"
20-22 पर

6

यह स्वीकार किए गए उत्तर के रूप में व्यापक नहीं है, लेकिन यदि आपने अपनी /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


4
शोर्टर: ईवैलsed 's/^/export /' /etc/environment
एरॉन मैकमिलिन

2
ऊपर का नॉन-टेम्प-फाइल संस्करण:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
टिम जोन्स

7
और भी छोटा set -a; source /etc/environment; set +a;:।
ulidtko
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.