जवाबों:
क्या हर बार डॉट टाइप किए बिना ऐसा करने का कोई तरीका है? उदाहरण के लिए स्क्रिप्ट से ही मूल शेल में बदलने के लिए एक कमांड?
मुझे नहीं लगता कि (टाइप करने के अलावा source somescript.sh
, लेकिन यह है कि शायद आप ^ ^ की तलाश में नहीं हैं)।
यदि आप स्क्रिप्ट को हमेशा की तरह चलाते हैं ./somescript.sh
, तो शेल फॉर्क्स और इस कमांड को निष्पादित करता है। यह कमांड को कर्नेल में भेजता है और फिर कर्नेल यह तय करता है कि #!
स्क्रिप्ट के अंदर लाइन को पार्स करके इस कमांड को कैसे निष्पादित किया जाए । कर्नेल तब निर्दिष्ट दुभाषिया लॉन्च करता है (इस मामले में शायद एक bash
उप-संस्करण)। somescript.sh
इसके वातावरण में संशोधन माता-पिता के खोल को प्रभावित किए बिना उपधारा में अलग-थलग कर दिया जाता है।
यदि आप चाहते हैं कि शेल किसी अन्य प्रक्रिया को लॉन्च किए बिना स्क्रिप्ट को स्वयं पढ़े, तो आपको स्पष्ट रूप से .
या source
कीवर्ड का उपयोग करके यह बताना होगा ।
alias
कमांड के साथ एक उपधारा नहीं बनाया जाए , जैसे कि स्कॉट का सुझाव दिया गया है।
यदि आप ./somescript.sh
एक बाहरी कार्यक्रम के रूप में निष्पादित करते हैं, तो यह रनिंग शेल प्रक्रिया के अंदर कुछ भी नहीं कर सकता है, जैसे कि गैर-निर्यात किए गए चर तक पहुंचना, चर सेट करना, वर्तमान निर्देशिका को बदलना, आदि। इसके आसपास कोई रास्ता नहीं है।
(ठीक है, ठीक है, आप सबप्रोसेस से डिबगर चला सकते हैं और पेरेंट प्रोसेस की मेमोरी को ट्विक कर सकते हैं। लेकिन अगर आप इसे आजमाते हैं, तो सबसे अधिक संभावना है कि परिणाम पेरेंट शेल को क्रैश कर रहा है।)
आपको दौड़ने की जरूरत है . ./somescript.sh
। यदि आप चाहें, तो आप इसे एक उपनाम या फ़ंक्शन के पीछे छिपा सकते हैं, लेकिन फिर से मूल नाम में उपनाम या फ़ंक्शन की परिभाषा करनी होगी।
मुझे लगता है कि जिस स्क्रिप्ट को आप चलाने की कोशिश कर रहे हैं, वह निष्पादन योग्य नहीं है। chmod a+x somescript.sh
उस फ़ाइल में उपयोगकर्ता, समूह और अन्य (ugo) के लिए निष्पादन बिट को जोड़ देगा। फ़ाइल की पहली पंक्ति को भी # की आवश्यकता होगी! शीर्ष पर लाइन, जैसे #!/bin/bash
।
ls -l somescript.sh
आपको फ़ाइल के लिए rwx ट्रिपल (रीड / राइट / एक्ज़ीक्यूट) दिखाएगा। आपको कम से कम पहले सेट में एक x की आवश्यकता होगी, यह मानते हुए कि आप फ़ाइल के मालिक हैं।
export PATH=$PATH:/usr/local/bin
अपने $ PATH में / usr / लोकल / बिन को जोड़ना पसंद करते हैं, तो आपको अपने चल रहे पर्यावरण चर को बदलने के लिए फ़ाइल को स्रोत करने की आवश्यकता है। यह प्रश्न वास्तव में है "मैं कैसे एक बैश स्क्रिप्ट से अपने चल रहे शेल में अपने पर्यावरण चर को प्रोग्रामेटिक रूप से बदल सकता हूं?" स्क्रिप्ट . ./somescript.sh
ठीक ही निष्पादित हो रही है - आप एक फ़ाइल में स्रोत के लिए डॉट कमांड का उपयोग कर रहे हैं। tcsh उसी चीज़ के लिए "स्रोत" का उपयोग करता है।
export PATH=$PATH:.
उस कमांड को शेल में रन करना या इसे अपने शेल कॉन्फ़िगरेशन फ़ाइल में जोड़ना, वर्तमान निर्देशिका को PATH चर में जोड़ देगा। PATH वैरिएबल उन निर्देशिकाओं की एक सूची है जहां आपका शेल बायनेरिज़ को निष्पादित करने के लिए दिखेगा जब आप एक कमांड जारी करते हैं।
यह आपको मौजूदा निर्देशिका में किसी भी निष्पादन योग्य को चलाने की अनुमति देगा ./
.
है ./
कि फ़ाइलनाम का हिस्सा नहीं है । रनिंग ।/scriptcript वर्तमान शेल में इसे निष्पादित नहीं . ./somescript
करता है जैसा कि करता है।