पर्यावरण चर का मौजूदा मूल्य कैसे दिखाएं?


24

जब मैं अपने सिस्टम के पर्यावरण पर जांच करता हूं, तो बहुत सारे पर्यावरण चर पॉप अप हो जाएंगे। मैं किसी विशेष चर की खोज कैसे कर सकता हूं?

एक किताब जो मैं पढ़ रहा हूं वह कहती है:

कभी-कभी आपके वातावरण में चर की संख्या काफी बढ़ जाती है, इतना ही नहीं जब आप केवल एक में रुचि रखते हैं, तो आप उन सभी मूल्यों को प्रदर्शित नहीं करना चाहते हैं। यदि यह मामला है, तो आप echoकमांड का उपयोग पर्यावरण चर के मौजूदा मूल्य को दिखाने के लिए कर सकते हैं ।

मैं इसे लिनक्स टर्मिनल में कैसे करूँ?

जवाबों:


25

बस:

echo "$VARIABLENAME"

पर्यावरण चर के लिए उदाहरण के लिए $HOME, उपयोग करें:

echo "$HOME"

जो तब कुछ इसी तरह प्रिंट करता है:

/home/username

संपादित करें : स्टीफन चेज़ेलस की टिप्पणी के अनुसार , यदि आप printenvइसके बजाय उपयोग करते हैं तो यह बेहतर हो सकता है echo:

printenv HOME

4
आप उद्धरण भूल गए (जब तक कि आप zsh या rc / es वाक्यविन्यास को लागू नहीं कर रहे हैं)। echoयह कमांड की एक खराब पसंद है क्योंकि यह चर की सामग्री को बदल सकता है। यह शेल पैरामीटर की सामग्री को उसी नाम से आउटपुट करेगा। उदाहरण के लिए 1, बॉर्न शेल का उपयोग करना या env vars के लिए यह आवश्यक नहीं है *। और आप env var के लिए उस दृष्टिकोण का उपयोग नहीं कर सकते हैं जिसका नाम शेल चर नाम के रूप में मान्य नहीं है।
स्टीफन चेजेलस

5
यह भी ध्यान दें कि यदि एक ही नाम (ओके, एक पैथोलॉजिकल केस) के साथ कई पर्यावरण प्रविष्टियां हैं, तो आपको जो मिलेगा वह शेल पर निर्भर करेगा (आमतौर पर या तो पहले एक या पिछले एक)। printenv VARउन सभी को प्रदर्शित करेगा (कम से कम GNU कार्यान्वयन के लिए)।
स्टीफन चेज़लस

9

निष्पादित करके:

printenv

आपको सभी पर्यावरण चर दिखाई देंगे। अधिक जानकारी के लिए आप यहां देख सकते हैं:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps


2
वास्तव में सवाल का जवाब देने के करीब आने के लिए, printenv variablenameकेवल नामित चर प्रदर्शित करेगा; जैसे, printenv  HOMEलगभग वैसा ही काम करेंगे echo  "$HOME"
जी-मैन

5

यह समझना महत्वपूर्ण है कि हर प्रक्रिया का पर्यावरण चर का अपना सेट होता है।

एक प्रक्रिया की आवश्यकता होने पर fork()सिस्टम कॉल, एक दूसरे की प्रक्रिया ( बच्चे ) पहली (के समान माता-पिता ) बनाया जाता है (इस प्रतिलिपि वातावरण है, जो या सिर्फ ढेर के ऊपर रहता है (बस नीचे दिए गए, निर्भर करता है कि आप ढेर के बारे में सोच भी शामिल है :-)- लेकिन यूनिक्स / लिनक्स में स्टैक उच्च पतों से नीचे बढ़ता है )।

आमतौर पर, बच्चे की प्रक्रिया फिर execve()सिस्टम कॉल को कॉल करेगी, जो अपनी (आभासी) मेमोरी में सब कुछ फेंक देगी और इसे निर्दिष्ट बाइनरी फ़ाइल में कोड और डेटा अनुभागों से फिर से संगठित करेगी ।

हालांकि, जब यह स्टैक को फिर से संगठित करता है , तो यह पर्यावरण को कॉपी करता है और तर्क तार execve()को स्टैक पर पहले (उस क्रम में), main()फ़ंक्शन को कॉल करने से पहले ( रिटर्न में प्रविष्टिcrt0 के बाद बूटस्ट्रैप कोड में बहुत काम किया जाता है) बाइनरी में निर्दिष्ट बिंदु ))।execve()

execve()सी लाइब्रेरी में सिस्टम कॉल के लिए रैपर हैं जो वर्तमान वातावरण (यानी माता-पिता के वातावरण की एक प्रति) को पारित करेंगे, इसके बजाय कॉल करने वाले इसे प्रदान करेंगे (इसलिए वास्तव में बच्चा माता-पिता के वातावरण को विरासत में देगा ) - देखें environ(7)

चलाने की कोशिश करें (रूट के रूप में) कमांड ps axeww | less... यह आपको सभी प्रक्रियाओं के लिए पर्यावरण दिखाएगा ! एक दिलचस्प एक प्रक्रिया आईडी 1 है (यानी initप्रक्रिया - बूट समय पर कर्नेल द्वारा बनाई गई पहली प्रक्रिया)।

यदि आप एक विशिष्ट प्रक्रिया के लिए पर्यावरण को देखना चाहते हैं (और आप जानते हैं कि यह प्रक्रिया आईडी है), कमांड चलाने की कोशिश करें cat /proc/<PID>/environ( <PID>प्रक्रिया आईडी के साथ प्रतिस्थापित )।

ध्यान दें कि यदि किसी प्रक्रिया में पर्याप्त विशेषाधिकार हैं, तो यह अपने स्वयं के स्टैक को फिर से लिख सकता है, जिससे यह जानना मुश्किल हो सकता है कि इसका वातावरण क्या है - पीएस आउटपुट में आप इस तरह की कुछ डेमॉन प्रक्रियाएं देखेंगे।

लेकिन अंत में, यह सभी वफ़ल उबलता है जो @ उपोस के ऊपर कहा गया है, यदि आप अपनी शेल प्रक्रिया में एक विशिष्ट पर्यावरण चर के वर्तमान मूल्य को देखना चाहते हैं, तो बस (बिलिन) कमांड echo "$<NAME>"( <NAME>नाम के साथ प्रतिस्थापित ) का उपयोग करें पर्यावरण चर जो आप में रुचि रखते हैं) ... बस ध्यान रखें कि एक ही चर का एक अलग मूल्य हो सकता है, या किसी अन्य प्रक्रिया में बिल्कुल मौजूद नहीं है।


1
(1) ध्यान दें कि eविकल्प ps, और /proc/…/environविशेष फ़ाइल, सभी प्रणालियों पर मौजूद नहीं हो सकती है। (2) AFAIK, हर यूनिक्स प्रक्रिया को अपने स्टैक को फिर से लिखने और अपने पर्यावरण चर को संशोधित करने का विशेषाधिकार है। (३) अधिक चर्चा के लिए, देखें कि पर्यावरण चर किससे संबंधित हैं? ( सुपर यूजर पर )।
जी-मैन का कहना है कि 'मोनिका'

मेरे पास यह मेरे सिर में था कि कुछ सिस्टम में रूट कमांड चलाने से इसकी कमांड लाइन दलीलें और पर्यावरण "जैसे" छिपने की प्रक्रिया से एक अप्रकाशित प्रक्रिया को रोकने का एक तरीका था ps... लेकिन अब जब आपने इस बिंदु को उजागर किया है, तो मुझे याद नहीं हो सकता कि मैं क्यों सोचा कि।
मरे जेनसेन

@MurrayJensen ने अत्यधिक वोट किए गए प्रश्न पर कुछ चर्चा के अनुसार मैंने "कर्ल" के बारे में पूछा कि पीएस में अपनी दलीलें छिपाते हुए - यह पॉसिक्स में अनिर्दिष्ट है कि क्या पीएस मूल रूप से प्रक्रिया में उत्तीर्ण हुए हैं, या एक प्रति जो प्रक्रिया के बाद संशोधित हो सकती है। शुरू कर दिया। कुछ सिस्टम (मुझे लगता है कि सोलारिस ??) मूल आर्ग को दर्शाता है चाहे कोई भी हो। (यहाँ लिंक है।) यह वही हो सकता है जो आप सोच रहे थे। :)
वाइल्डकार्ड

बिंगो! हां, बेशक सोलारिस इसे "सही ढंग से" करता है :-) ताज़ा करने के लिए धन्यवाद ...
मरे जेन्सन

1

आप वह पा सकते हैं, जिसकी आप तलाश कर रहे हैं export:

export | grep HOME

$HOMEचर की सामग्री दिखाएगा ।


1

अगर आपको बहुत सारे var सेट करने हैं:

  ( set -o posix ; set ) | sort >~/vars.before

उन्हें सेट करने के बाद:

  ( set -o posix ; set ) | sort >~/vars.after

सेट किए गए प्रदर्शन की तुलना में:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

इस तरह आप अपने आप को जल्द ही पाएंगे, cnf फ़ाइलों में पूर्व-परिभाषित शेल संस्करणों के कई सेटों के साथ काम करना, जो tmux के साथ मिलकर आपको शेल वातावरण में कॉन्फ़िगरेशन प्रबंधन का मास्टर बना देगा:

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.