Apple Mavericks - क्यों यह एक लाइन BASH स्क्रिप्ट मेरे अजगर आभासी वातावरण सेट नहीं करता है जैसे मुझे उम्मीद है?


2

मेरे पास निम्नलिखित बैश स्क्रिप्ट है:

#!/bin/bash
echo $MYPROJECT_HOME/bin/myproject_venv/bin/activate
source $MYPROJECT_HOME/bin/myproject_venv/bin/activate
echo $MYPROJECT_HOME/bin/myproject_venv/bin/activate

अनुमतियाँ दिखाती हैं कि फ़ाइल निष्पादन योग्य है, और यह मेरे स्वामित्व में है। अनुमतियाँ हैं:

-rwxr-xr-x

जब मैं कमांड लाइन पर स्क्रिप्ट चलाता हूं तो यह दो बार सही रास्ते को प्रिंट करता है activate स्क्रिप्ट मुझे उम्मीद है। हालांकि, यह सही ढंग से मध्य रेखा को नहीं चलाता है - वह जो स्क्रिप्ट का स्रोत है।

यदि मैं उस मध्य रेखा को कॉपी करता हूं और इसे कमांड लाइन पर चलाता हूं, हालांकि, यह ठीक काम करता है।

क्या देता है?

जवाबों:


4

समस्या

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

आप इसे आसानी से जांच सकते हैं:

$ cat test.sh
#!/bin/bash
export FOO="bar"
echo "FOO in test.sh is : $FOO"

$ export FOO="OOF"
$ echo $FOO
OOF                       ### Here, in the parent shell, $FOO is 'OOF'
$ ./test.sh
FOO in test.sh is : bar   ### In the shell running the script, $FOO is 'bar'
$ echo $FOO
OOF                       ### Back in the parent shell, $FOO is still 'OOF'

इसलिए, शेल स्क्रिप्ट को अपने आप में चलाया जाता है, अलग शेल और, जैसा कि कहा गया है help source:

source: source filename [arguments]
    Execute commands from a file in the current shell.

इसलिए, source केवल प्रभावित करता है वर्तमान शेल, जो एक बैश स्क्रिप्ट के मामले में है, स्क्रिप्ट को चलाने के लिए लॉन्च किया गया है न कि पैरेंट शेल जहां आपने स्क्रिप्ट का नाम टाइप किया है।


समाधान की

यदि आप किसी ऐसी फ़ाइल को स्रोत बनाना चाहते हैं जो चर सेट करती है, तो आपको उस शेल से करना चाहिए जिसे आप चला रहे हैं, बस चलाएं source सीधे कमान।

वैकल्पिक रूप से, आप कर सकते हैं source इसे अपने से जोड़कर सभी नए शेल इंस्टेंस के लिए हो bash स्टार्टअप फ़ाइल। ये है .profile OSX में और .bashrc अन्य मामलों में। तो, अपने संपादित करें $HOME/.profile फ़ाइल और इस लाइन को जोड़ने:

source $MYPROJECT_HOME/bin/myproject_venv/bin/activate

अब, आपके द्वारा खोले गए सभी नए टर्मिनलों में खटास आ जाएगी activate फ़ाइल। या, यदि आप मांग पर ऐसा करने में सक्षम होना चाहते हैं, तो अपनी स्क्रिप्ट को फ़ंक्शन में बदल दें। इन लाइनों को अपने में जोड़ें .profile:

activate(){
  echo "Sourcing $TEST/activate"
  source $TEST/activate
}

स्क्रिप्ट के विपरीत कार्य, एक नया शेल इंस्टेंस लॉन्च नहीं करते हैं और इसलिए, आपके द्वारा लॉन्च किए गए शेल को संशोधित कर सकते हैं। अब आप चला सकते हैं activate स्रोत के लिए $TEST/activate फ़ाइल।


2

क्या ऐसा हो सकता है कि स्क्रिप्ट activate चल रहा है, लेकिन पर्यावरण चर सेट करके काम करता है? यदि हां, तो यह आपको समस्याएं दे सकता है। परीक्षण के रूप में, मैंने दो स्क्रिप्ट बनाईं, command तथा activate। पहली आपकी बैश स्क्रिप्ट की तरह है:

#!/bin/bash
echo $TEST/activate
source $TEST/activate
echo $TEST/activate

तथा activate एक साधारण लाइनर है:

export TEST="Hello World!"

आउटपुट दिखाता है कि पर्यावरण चर में परिवर्तन बरकरार नहीं है। यहाँ मैं इसे चलाने के लिए आदेश दिया है, और परिणाम:

export TEST="/Users/me"
./command

यह पर्यावरण चर बदलने लगता है; यहाँ उत्पादन है:

/Users/me/activate
Hello World!/activate

लेकिन वापस अपने कमांड प्रॉम्प्ट पर, मैं देख सकता हूं कि $ TEST का मूल्य पहले जैसा है:

echo $TEST

आउटपुट है:

/Users/me

शायद यह आपकी समस्या है?


हां, मुझे लगता है कि यह समस्या है, या समस्या से निकटता से संबंधित है। मैं अपने परिवेश चर तक पहुँच प्राप्त करने और उन्हें लिखने में सक्षम होने के लिए बैश स्क्रिप्ट कैसे प्राप्त कर सकता हूं? मुझे लगता है कि स्क्रिप्ट कमांड लाइन पर पर्यावरण की तुलना में कुछ नए / ताजा / अलग वातावरण में चल रही है।
jononomo

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