क्या निर्यात करता है PATH = कुछ: $ PATH का मतलब है?


27

मैं लिनक्स के लिए बहुत नया हूं और मैंने .profileअपने होम फोल्डर के तहत फाइल के अंत में निम्नलिखित कमांड डाल दी है :

export PATH="~/.composer/vendor/bin:$PATH"

मैं विंडोज से पर्यावरण चर और उनके मूल्यों के मुद्दों को जानता हूं, लेकिन इस मामले में मैं यह समझना चाहता हूं कि यह कमांड क्या करता है, और इसमें कौन से हिस्से शामिल हैं:

  1. शुरुआत में यह "निर्यात" वाक्यांश क्या है? क्या यह बैश के लिए उपलब्ध होने वाले डेटा का निर्यात कर रहा है?

  2. पहला PATHक्या है और दूसरा क्या है $PATH, और हमें दो की आवश्यकता क्यों है?


OSes के बीच कुछ तकनीकी अंतर, यह विंडोज पर इस प्रक्रिया के बराबर है: windowsitpro.com/systems-management/…
दो-बिट अल्केमिस्ट

1
"निर्यात" बैश द्वारा शुरू किए गए नए कार्यक्रमों के लिए परिवर्तन को दिखाई देता है।
थोरबजोरन राव एंडरसन

1
@ ThorbjørnRavnAndersen: नहीं, ऐसा होता है कि आप exportकमांड का उपयोग करते हैं या नहीं , क्योंकि PATHचर पहले से ही निर्यात के रूप में चिह्नित है। (यदि आप मेरी बात पर विश्वास नहीं करते हैं तो दोनों तरह से कोशिश करें!)
डेविड १ '

जवाबों:


39

शुरुआत में यह "निर्यात" वाक्यांश क्या है?

exportएक कमांड है (अधिक सटीक रूप से यह एक बैश बिलिन है , अर्थात यह एक निष्पादन योग्य मौजूद नहीं है PATH, यह एक कमांड है जिसे बैश ने स्वयं बनाया है)।

क्या यह बैश के लिए उपलब्ध होने वाले डेटा का निर्यात कर रहा है?

exportअसाइनमेंट के दाईं ओर मान के बाईं ओर पर्यावरण चर सेट करता है; ऐसा वातावरण चर उस प्रक्रिया को दिखाई देता है जो इसे और एक ही वातावरण में पैदा होने वाले सभी उपप्रकारों को देती है, अर्थात इस मामले में बाश उदाहरण के लिए कि स्रोत ~/.profileऔर सभी उपप्रकार एक ही वातावरण में पैदा होते हैं (जैसे कि अन्य गोले भी हो सकते हैं) , जो बदले में इसे एक्सेस करने में सक्षम होगा)।

पहला PATHक्या है और दूसरा क्या है $PATH, और हमें दो की आवश्यकता क्यों है?

पहले PATHजैसा कि ऊपर बताया का उपयोग कर स्थापित किया जाना वातावरण चर है export

चूँकि PATHआम तौर पर कुछ होता है, जब ~/.profileइसे खट्टा किया जाता है (डिफ़ॉल्ट रूप से इसमें /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), बस बनाने के PATHलिए सेटिंग में केवल शामिल ~/.composer/vendor/binहोगा ।PATH~/.composer/vendor/bin

इसलिए चूंकि कमांड में एक वेरिएबल के संदर्भ को कमांड के मूल्यांकन के समय बैश द्वारा वेरिएबल के वैल्यू के साथ (या "विस्तारित") बदल दिया जाता है , :$PATHइसे वैल्यू के अंत में रखा जाता है PATHताकि इसे PATHसमाप्त किया जाए ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( जिसमें ) यानी क्या PATHपहले ~/.composer/vendor/bin:से ही शुरू में प्लस ) शामिल हैं।


भयानक स्पष्टीकरण।
चॉयलटन बी। हिगिनबॉटम

16

https://help.ubuntu.com/community/EnvironmentVariables शायद आपकी मदद करेंगे। यह man bashसमझने में भी बहुत मददगार हो सकता है कि यह कैसे काम करता है (कम से कम बाश में)

वैसे भी - जैसा कि PATH=आप मूल रूप से PATHचर सेट कर रहे हैं , खोज के लिए कुछ नए रास्तों को जोड़कर, पहले से ही अंत में / पहले से तय किए गए रास्तों को जोड़कर, $PATH(जो मूल रूप से PATHचर का संदर्भ है )।

तो, मान लीजिए कि आपका PATHअब तक कुछ इस तरह सेट था:

PATH="x:y:z"

और फिर आपने सेट किया

PATH="a:b:c:$PATH"

आपका PATHबाद ऐसा होगा:

a:b:c:x:y:z

मुझे उम्मीद है कि इसका कोई अर्थ है।

और इसके शीर्ष पर आप नए चर का निर्यात करते हैं इसलिए यह आपके वातावरण में जाना जाता है जिसमें बाल प्रक्रियाएं / उपधाराएं भी शामिल हैं।

बस यह भी ध्यान रखें कि निर्देशिकाओं का क्रम PATHमहत्वपूर्ण हो सकता है। और कुछ इस तरह PATH="$PATH:a:b:c"आपको परिणाम देगा:

x:y:z:a:b:c

जो कमांड की खोज करते समय निर्देशिकाओं / रास्तों के क्रम को प्रभावित करेगा (यदि आपके पास एक से अधिक निर्देशिकाओं में आपकी कमान है, तो पहले पाया जाने वाला उपयोग किया जाएगा - जो आपको कभी-कभी कुछ अप्रत्याशित परिणाम दे सकता है)।


2

यहां यह आदेश है ताकि हर कोई बुलेट पॉइंट के माध्यम से साथ-साथ चल सके। export PATH="~/.composer/vendor/bin:$PATH"

  • exportशेल बिल्ट-इन (जिसका अर्थ है कि नहीं /bin/export, यह एक शेल की बात है) कमांड मूल रूप से एनवायर्नमेंटल वैरिएबल को अन्य प्रोग्राम्स से उपलब्ध bashकराती है (अतिरिक्त रीडिंग में लिंक किए गए प्रश्न देखें) और सब्स्क्रिप्शन।
  • शेल में असाइनमेंट पहले विस्तार लेगा, फिर असाइनमेंट दूसरा होगा। तो जो दोहरे उद्धरण चिह्नों के अंदर है, वह पहले विस्तारित हो जाता है, PATHबाद में चर में सहेजा जाता है ।
  • $PATHडिफ़ॉल्ट PATHअसाइनमेंट है (या कम से कम यह वैरिएबल कैसा दिखता है जब तक कि यह कमांड आपके .bashrcया .profile) में दिखाई देता है , और इसका विस्तार करें।
  • ~/.composer/vendor/binका विस्तार करने जा रहा है /home/username/.composer/vendor/bin, जहां .composerप्रमुख डॉट के कारण छिपा हुआ फ़ोल्डर है।
  • इस शॉर्ट ~/.composer/vendor/bin:$PATHको अब फोल्डर की लंबी सूची में बदल दिया गया है :। सब कुछ दोहरे उद्धरण चिह्नों में संलग्न है ताकि हम उनके पथ के रिक्त स्थान वाले फ़ोल्डर्स को शामिल करें।
  • अंत में सब कुछ PATHचर और बाहरी आदेशों में संग्रहीत किया जाता है जिसका उपयोग करने की अनुमति है

सरल उदाहरण

मेरा इंटरेक्टिव शेल वास्तव में है mksh, जो exportबिल्डिन में भी होता है । exportसेट का उपयोग करके VAR, मेरे वेरिएबल को कमांड / सबप्रोसेस की बाद की श्रृंखला द्वारा पास और उपयोग किया जा सकता है, जहां मैंने उसी वेरिएबल को निर्यात किया था

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

एक्स्ट्रा रीडिंग


3
नहीं है, ~में ~/.composer/vendor/binविस्तार नहीं किया जाएगा! टिल्ड का विस्तार केवल कुछ विशेष स्थानों पर किया जाता है, जैसे =संकेत के बाद सीधे । PATH="~/.foo:$PATH"में परिणाम ~/.foo:/other/path/dirs...। लेकिन इसमें ~विस्तार किया जाएगा PATH=~"/.foo:$PATH", जिसके परिणामस्वरूप /home/user/.foo:/other/path/dirs...
वोल्कर सीगल

2

मैंने यहां और वेब में अन्य स्थानों पर पढ़ा है, इस बारे में एक मित्र से बात की और फैसला किया कि एक नए व्यक्ति के रूप में (शायद उबंटू के एक नए व्यक्ति के बारे में तब कुछ यहां सोचा जा सकता है), मुझे इस कमांड को मैप करना चाहिए - मुझे एक नक्शा बनाना चाहिए और इस प्रकार जानें कि यह व्हाट्सआउट और ठिकाना है:

प्रारंभिक आंकड़े

यदि अभी के लिए आप इस अध्याय में कुछ नहीं समझे हैं - चिंता न करें, यह स्पष्ट हो जाएगा क्योंकि आप पढ़ते रहेंगे, लेकिन इस मामले को समझने के लिए आपको पर्यावरण चर (ईवीएस), उनके मूल्यों और उद्देश्य को पढ़ना होगा। । अब मैं कमांड को सरल शब्दों में और मैपिंग की विधि में समझाने की कोशिश करूंगा, मेरे जैसे नए लोगों के लिए, और केवल नए लोगों के लिए। यहां अपना सर्वश्रेष्ठ प्रदर्शन करने की कोशिश की ...

मानचित्रण

export PATH="~/.composer/vendor/bin:$PATH"

EV "PATH" का मूल मान उबंटू 15.10 के साथ आता है, यह है:

/usr/bin:/usr/sbin

कमांड में ही ध्यान दें कि हमारे पास दो पैट वाक्यांश हैं। अंतिम एक $ PATH है - $ का कहना है कि "आपके बगल में EV के मूल मूल्य या मूल्यों को प्रिंट करें"; इसके बगल में EV PATH EV है।

हमने स्वयं पथ चर का निर्यात किया (इसे उप प्रक्रियाओं के लिए भी उपलब्ध कराया, IE प्रक्रियाएं जो CLI में चलती हैं जो वास्तव में बैश शेल नहीं हैं, लेकिन इसके अंदर चलती हैं (जैसे Drush , जो Drupal CLI है)।

निर्यात के अलावा हमने इसका विस्तार भी किया: पहले PATH वाक्यांश (PATH =) ने हमें एक अतिरिक्त मूल्य (~ / .composer / विक्रेता / बिन :) मूल मूल्य ($ PATH द्वारा प्रतिनिधित्व) में जोड़ने के लिए उपयोग किया।

  • उपर्युक्त पैराग्राफ में मेरे द्वारा बताए गए नए मूल्य के अंत में उपनिवेश (:) मूल एक से नए मूल्य को अलग करने के लिए उपयोग करता है।

  • "" वह क्षेत्र है जिसमें मान / निवास रहता है।

  • ~ होम फोल्डर है।


मुझे उम्मीद है कि इस मैपिंग के बाद, मैंने अपने जैसे नए लोगों को आदेश दिया।


1

exportआदेश चर subshells में उपलब्ध कराता है। यही है, इसके बिना, PATHउप-श्रेणियों में चर दिखाई नहीं देगा।

PATH दो बार उल्लेख किया गया है:

  • चर के रूप में मान को =संकेत के बाईं ओर सौंपा जा रहा है ।
  • चर नाम के रूप में =संकेत के अपने मूल्य अधिकार द्वारा प्रतिस्थापित किया जा रहा है । यह पुराने मूल्य को नए मूल्य का हिस्सा बनाता है।

1
"अर्थात्, इसके बिना, PATHउप-श्रेणियों में चर दिखाई नहीं देगा।" यह गलत है; PATHएक पर्यावरण चर है (जो शेल चर के रूप में एक ही चीज नहीं है ) इसलिए यह स्वचालित रूप से निर्यात किया जाता है, और exportकमांड अनावश्यक है।
डेविड

बॉर्न शेल परिवार वास्तव में शेल और पर्यावरण चर के बीच अंतर नहीं करता है। ( sc.tamu.edu/help/general/unix/vars.html ) मेरे सिस्टम (आर्क लिनक्स) पर, bash को setenvकमांड भी नहीं पता है ।
रेक्सकोगिटंस

1
पर्यावरण चर के बीच अभी भी एक अंतर है जो कर्नेल के बारे में जानता है, और शेल चर जो बाश करने के लिए आंतरिक हैं। चूंकि PATHपर्यावरण से उत्पन्न होता है, यह स्वचालित रूप से निर्यात किया जाता है, इसलिए आपको exportबच्चे की प्रक्रियाओं के लिए होने वाले परिवर्तनों के लिए चलने की आवश्यकता नहीं है (आपके द्वारा जोड़ा गया पृष्ठ इसके विपरीत)।
डेविड

पर्यावरण चर, कर्नेल की संपत्ति नहीं है, बल्कि प्रक्रिया की है। चूंकि हम जिस प्रक्रिया के बारे में यहां बात कर रहे हैं वह श, बश (उबंटू ज़श का उपयोग करता है?) है, मुझे लगता है कि हम उन्हें शेल चर के बराबर छोड़ सकते हैं। लेकिन, ज़ाहिर है, शेल चर किसी भी यादृच्छिक कार्यक्रमों के लिए पारित नहीं होते हैं क्योंकि पर्यावरण चर हैं।
रेक्सकोगिटंस

मुझे लगता है कि हम इस बिंदु पर शब्दार्थ में फंस गए हैं। मैं बस यही कहना चाह रहा था कि मारपीट PATH=fooऔर export PATH=fooसमान व्यवहार है।
डेविड

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. exportबैश की एक buildin आदेश है, साधन चर निर्यात envirement चर किया जाना है। (आप help exportअधिक दुबला करने के लिए टाइप कर सकते हैं

    (आदेश का पालन करने वाले कमांड पैरामीटर्स हैं, अंतरिक्ष द्वारा विभाजित हैं, इसलिए इस मामले में, केवल एक पैरामीटर है)

  2. PATHचर नाम, आम तौर पर, पूर्वनिर्धारित बैश द्वारा varibale, अपरकेस में नामित किया है।

  3. =इस चर के लिए असाइन मूल्य का मतलब है।

  4. सभी स्ट्रिंग वैरिएबल का मान है

  5. नाम $PATHका एक प्रकार का कश है, नाम variable expantion, बश PATHपैरामीटर स्ट्रिंग में मौजूद के मूल्य को बदल देगा , इससे पहले कि exportकमांड को स्ट्रिंग भेजें

  6. :कि इस परिवर्तनीय उपयोग करना चाहते हैं सभी आवेदन द्वारा पथ चर और understooded में एक spcial चार में। इसका मतलब सेपरेटर है। इसलिए वे PATH चर में बहुत सारी निर्देशिका करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.