समस्या
यह पूरी तरह से काम कर रहा है (आप इसे जोड़कर देख सकते हैं 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
फ़ाइल।