मैं अपने बैश स्क्रिप्ट को निष्पादित करते समय मॉड्यूल लोड क्यों नहीं कर सकता, लेकिन केवल इसे सोर्स करते समय?


13

मैं अपने सिस्टम पर संकुल को नियंत्रित करने के लिए मॉड्यूल का उपयोग कर रहा हूं और मैंने python/2.7.2एक मॉड्यूल के रूप में स्थापित किया है। मेरे पास सरल अजगर निष्पादन योग्य है python_exe.pyजिसे मैं एक सरल 'ड्राइविंग' स्क्रिप्ट से कॉल करने जा रहा हूं runit.shrunit.shस्क्रिप्ट कुछ इस तरह है:

#!/bin/bash
module load python/2.7.2
arg1=myarg1
arg2=15
arg3=$5
/path/to/python_exe.py -a $arg1 -b $arg2 -c $arg3

होवर, जब मैं बस चलाता हूं, तो ./runit.shयह मुझे "मॉड्यूल: कमांड नहीं मिला" बेचता है। जब मैं source runit.sh, हालांकि, यह मॉड्यूल को सही ढंग से लोड करता है। ऐसा क्यों है?

जवाबों:


13

क्योंकि moduleकमांड एक उपनाम या शेल फ़ंक्शन है ( मॉड्यूल (1) में " पैकेज इनिशियलाइज़ेशन देखें" )। जब आप कहते हैं , यह सीधे अपने इंटरैक्टिव शेल में कमांड टाइप करने जैसा है । लेकिन जब आप कहते हैं , आप एक नया, गैर-इंटरैक्टिव शेल चला रहे हैं। गैर-इंटरैक्टिव गोले में आमतौर पर मानक उपनाम और शेल फ़ंक्शन सेट नहीं होते हैं।source runit.shmodule./runit.sh

मॉड्यूल (1) कहता है, '' मॉड्यूल-पैकेज और मॉड्यूल कमांड को तब आरंभ किया जाता है जब शेल-विशिष्ट इनिशियलाइज़ेशन स्क्रिप्ट को खोल में रखा जाता है। स्क्रिप्ट मॉड्यूल कमांड बनाता है , या तो एक उपनाम या शेल फ़ंक्शन के रूप में,… ”यदि आपको moduleकिसी स्क्रिप्ट में कमांड चलाने की आवश्यकता है , तो इनिशियलाइज़ेशन स्क्रिप्ट खोजें जो moduleकमांड को परिभाषित करती है और sourceइसे स्क्रिप्ट से।


क्या यह .bashrc और .bash_profile का उपयोग करने के बीच अंतर है? उनमें से केवल एक में उपयोग के लिए मॉड्यूल सिस्टम शुरू करने के लिए आरंभीकरण दिनचर्या है।
drjrm3

मुझे बिल्कुल यकीन नहीं है कि आप क्या पूछ रहे हैं। लेकिन: बैश डिफ़ॉल्ट रूप से निम्नलिखित (इन कार्यों विकल्प द्वारा अधिरोहित जा सकता है) करता है: एक लॉगिन खोल पढ़ता `~ / .bash_profile` लेकिन नहीं ~/.bashrc, एक इंटरैक्टिव खोल कि एक लॉगिन खोल नहीं है (उदाहरण के लिए, आप क्या मिलेगा आप टाइप करता है, तो bashके रूप में एक कमांड) पढ़ता है ~/.bashrcलेकिन नहीं ~/.bash_profile, और एक गैर-संवादात्मक शेल (जैसे, एक स्क्रिप्ट चलाने वाला) न तो पढ़ता है। … (Cont'd)
स्कॉट '

(Cont'd) ... शायद यही कारण है कि साइरस ने सुझाव दिया #!/bin/bash -i- क्योंकि -iविकल्प शेल को इंटरैक्टिव बनाता है, और इसलिए इसे पढ़ने का कारण होगा ~/.bashrc। IMHO, यह ओवरकिल है, क्योंकि इंटरैक्टिव मोड अवांछित सामान (जैसे लिखने के लिए ~/.bash_history) के साथ आ सकता है । दूसरी ओर, यदि moduleएक उपनाम के रूप में परिभाषित किया गया है (एक शेल फ़ंक्शन के विपरीत), यह एक गैर-इंटरैक्टिव शेल में काम नहीं करेगा जब तक आप नहीं कहते हैं shopt -s expand_aliases, इसलिए शायद साइरस का जवाब सबसे अच्छा है।
स्कॉट

4

ऐसा लगता है कि आपके सिस्टम में शेल का साधारण आह्वान उर्फ ​​(या फ़ंक्शन) को विरासत में नहीं मिला है, जिसके साथ परिभाषित किया गया है module, इसलिए शेल इसे खोजने में सक्षम नहीं है (अंश के साथ नोट के नीचे देखें)। यह type moduleकैसे moduleवर्तमान में परिभाषित किया गया है यह देखने के लिए संकेत से प्रयास करें ।

स्रोत के साथ अनिवार्य रूप से ऐसा है यदि आप कीबोर्ड से स्क्रिप्ट की प्रत्येक पंक्ति लिखते हैं।
ध्यान दें कि एक तरफ आप वर्तमान शेल के सभी विशिष्ट इतिहास को प्राप्त कर रहे हैं, लेकिन दूसरी तरफ, वर्तमान शेल को आपकी स्क्रिप्ट और moduleमंगलाचरण के सभी पक्षों के प्रभाव के अधीन किया जाएगा ।

एक स्क्रिप्ट के स्रोत और इसे निष्पादित करने के बीच अंतर के बारे में आप सुपरयूजर सितंबर 2009 या दिसंबर 2009 , उबंटू फरवरी 2011 , यूनिक्स अगस्त 2011 , स्टैकवॉटरफ़्लो 2012 या कई अन्य स्थानों पर पढ़ सकते हैं।

इस मॉड्यूल के खंड में इस संबंध में एक चेतावनी है :

... मॉड्यूल चर को उतारने पर पर्यावरण चर अप्रभावित होते हैं। इस प्रकार, एक मॉड्यूलफाइल को लोड करना संभव है और फिर पर्यावरणीय चर को उनके पूर्व स्थिति में लौटने के बिना इसे अनलोड करना संभव है

इसलिए इसे एक स्क्रिप्ट में निष्पादित करना अधिक बुद्धिमान लगता है

उत्तरार्द्ध को पूरा करने के लिए मैं सोच सकता हूं:

  1. एक इंटरेक्टिव शेल का उपयोग करने के लिए , वर्तमान शेल के विशिष्ट इतिहास की उपेक्षा करते हुए, अपनी स्क्रिप्ट के शेबंग को संशोधित करना

    #!/bin/bash -i

    एक इंटरएक्टिव शेल एक ट्टी पर उपयोगकर्ता इनपुट से कमांड पढ़ता है। अन्य बातों के अलावा, ऐसा शेल सक्रियण पर स्टार्टअप फ़ाइलों को पढ़ता है, एक शीघ्रता प्रदर्शित करता है, और डिफ़ॉल्ट रूप से नौकरी नियंत्रण को सक्षम करता है ...

  2. यदि इसके बजाय आप वर्तमान शेल की विशिष्ट कहानी को विरासत में लेना पसंद करते हैं, तो आप इसे स्रोत करने का प्रयास कर सकते हैं ... लेकिन एक उपधारा में

    ( source runit.sh )
  3. की वर्तमान उर्फ / समारोह खोजने की कोशिश करें moduleके साथ type moduleतो अपनी स्क्रिप्ट परिणाम में बदलाव लाते हैं। नोट कुछ पर्यावरण चर के लिए सेट नहीं किया जा सकता है module
    आप चाहें तो डायरेक्टरी में इनिशियलाइज़ेशन स्क्रिप्ट पा सकते हैं $MODULESHOME/init/<shell>


मॉड्यूल
के प्रश्नोत्तर में याद किया गया टिप्पणी

एक बच्चे की प्रक्रिया (स्क्रिप्ट) मूल प्रक्रिया के वातावरण को नहीं बदल सकती है। एक स्क्रिप्ट में एक मॉड्यूल लोड केवल स्क्रिप्ट के लिए पर्यावरण को प्रभावित करता है। जिस तरह से आप एक स्क्रिप्ट को बदल सकते हैं वर्तमान वातावरण को स्क्रिप्ट को स्रोत करने के लिए है जो इसे वर्तमान प्रक्रिया में पढ़ता है।

इसलिए यदि आप वर्तमान परिवेश को संशोधित करने से बचना चाहते हैं, तो मुझे लगता है कि शेबंग (1) को बदलने की कोशिश करना बेहतर होगा या स्क्रिप्ट को एक उपधारा (2) में बदलना चाहिए । मैं मामले की प्रयोज्यता (3) के बारे में पूरी तरह सुनिश्चित नहीं हूं।


नोट मॉड्यूल के
मैनुअल और विवरण पृष्ठों से अंश

moduleमॉड्यूल पैकेज के लिए एक यूजर इंटरफेस है। moduleउपनाम या समारोह कार्यान्वित modulecmdकार्यक्रम और शेल कमांड के उत्पादन का मूल्यांकन है। पहला तर्क modulecmdशेल के प्रकार को निर्दिष्ट करता है।

मॉड्यूल-पैकेज और moduleकमांड को तब आरंभ किया जाता है जब शेल-विशिष्ट इनिशियलाइज़ेशन स्क्रिप्ट को शेल में सॉर्ट किया जाता है । स्क्रिप्ट मॉड्यूल कमांड बनाता है, या तो एक उपनाम या शेल फ़ंक्शन के रूप में, मॉड्यूल वातावरण चर बनाता है


लेकिन वह मूल प्रक्रिया के वातावरण को प्रभावित करने की कोशिश नहीं कर रहा है; वह केवल अपने पायथन को स्क्रिप्ट से चलाने के लिए निष्पादन योग्य बनाने की कोशिश कर रहा है । इसके अलावा, आपका उत्तर स्पष्ट नहीं करता है कि उसे "मॉड्यूल: कमांड नहीं मिला" त्रुटि संदेश क्यों मिलता है।
स्कॉट

@ बहुत धन्यवाद इससे पहले कि मैं अनजाने में उत्तर के बड़े हिस्से को काट देता और केवल एक टुकड़ा पोस्ट करता। उत्तर फिर से लिखा गया।
हस्तूर

1
+1।  ( source runit.sh )एक अच्छा जवाब है; मैंने इसके बारे में नहीं सोचा था। और संदर्भों का एक अच्छा संग्रह।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.