बैश स्क्रिप्ट में स्रोत का उपयोग करते समय 'स्रोत: नहीं मिला' त्रुटि प्राप्त करना


159

मैं लिखने की कोशिश कर रहा हूं (जो मैंने सोचा था) एक साधारण बैश स्क्रिप्ट होगी जो:

  1. $ 1 पर एक नया वातावरण बनाने के लिए virtualenv चलाएं
  2. आभासी वातावरण को सक्रिय करें
  3. कुछ और सामान करें (django स्थापित करें, django-admin.py को virtualenv के पथ में जोड़ें, आदि)

चरण 1 काफी अच्छा काम करता है, लेकिन मैं virtualenv को सक्रिय करने के लिए प्रतीत नहीं कर सकता। Virtualenv से परिचित न होने वालों के लिए, यह एक activateफाइल बनाता है जो वर्चुअल वातावरण को सक्रिय करता है। सीएलआई से, आप इसका उपयोग करके चलाते हैंsource

source $env_name/bin/activate

जहाँ $ env_name, जाहिर है, उस dir का नाम है जिसमें वर्चुअल env स्थापित है।

अपनी स्क्रिप्ट में, वर्चुअल वातावरण बनाने के बाद, मैं इस तरह से सक्रिय स्क्रिप्ट के लिए पथ संग्रहीत करता हूं:

activate="`pwd`/$ENV_NAME/bin/activate"

लेकिन जब मैं फोन करता हूं source "$activate", मुझे यह मिलता है:

/home/clawlor/bin/scripts/djangoenv: 20: source: not found

मुझे पता है कि $activateसक्रिय स्क्रिप्ट के लिए सही रास्ता है, वास्तव में मैं यह भी परीक्षण करता हूं कि मेरे कॉल करने से पहले एक फ़ाइल है source। लेकिन sourceखुद इसे खोजने के लिए प्रतीत नहीं कर सकते। मैंने सीएलआई में मैन्युअल रूप से सभी चरणों को चलाने की कोशिश की है, जहां सब कुछ ठीक है।

मेरे शोध में मुझे यह स्क्रिप्ट मिली , जो कि मैं जैसा चाहता हूं, वैसा ही है, लेकिन बहुत सारी अन्य चीजें भी कर रहा हूं, जिनकी मुझे जरूरत नहीं है, जैसे ~ / .virtualenv निर्देशिका (या जो कुछ भी है) में सभी आभासी वातावरणों को संग्रहीत करना। $ WORKON_HOME)। लेकिन यह मुझे लगता है कि वह मूल रूप से उसी तरह का रास्ता बना रहा है activate, और source "$activate"मुझे बता रहा है।

यहाँ यह पूरी तरह से स्क्रिप्ट है:

#!/bin/sh

PYTHON_PATH=~/bin/python-2.6.1/bin/python

if [ $# = 1 ]
then
    ENV_NAME="$1"
    virtualenv -p $PYTHON_PATH --no-site-packages $ENV_NAME
    activate="`pwd`/$ENV_NAME/bin/activate"

    if [ ! -f "$activate" ]
    then
        echo "ERROR: activate not found at $activate"
        return 1
    fi

    source "$activate"
else
    echo 'Usage: djangoenv ENV_NAME'
fi

अस्वीकरण: मेरा बैश स्क्रिप्ट-फू बहुत कमजोर है। मैं सीएलआई में काफी सहज हूं, लेकिन कुछ बेहद मूर्खतापूर्ण कारण हो सकते हैं, जो काम नहीं कर रहे हैं।

जवाबों:


230

यदि आप बैश स्क्रिप्ट लिख रहे हैं, तो उसे नाम से पुकारें:

#!/bin/bash

/ बिन / श को बैश होने की गारंटी नहीं है। इसने कुछ साल पहले (IIRC) उबंटू में एक टन टूटी स्क्रिप्ट का कारण बना।

स्रोत बिलिन बस बैश में ठीक काम करता है; लेकिन आप नॉर्मन जैसे सुझाव दिए गए डॉट का उपयोग कर सकते हैं।


यह समाधान मूल रूप से नॉर्मन रैमसे के जवाब में एक टिप्पणी थी। चूंकि यह वही है जो वास्तव में समस्या को ठीक कर रहा है, इसलिए मैंने इसे 'स्वीकृत उत्तर' के रूप में बदल दिया है
क्रिस लॉकर

185

POSIX मानक में, जिसका /bin/shसम्मान करना है, कमांड .(एक एकल बिंदु) है, नहीं sourcesourceआदेश एक है csh-ism कि में खींच लिया जा चुका है bash

प्रयत्न

. $env_name/bin/activate

या यदि आपके पास bashअपने कोड में गैर-पॉसिक्स- जीव हैं, तो उपयोग करें #!/bin/bash


1
जो इसे ठीक करता है। (बदलते / बिन / श / से / बिन / बाश)। किसी कारण से स्क्रिप्ट के खत्म होने पर पर्यावरण CLI में सक्रिय नहीं होता है, लेकिन यह एक छोटी समस्या है।
क्रिस लॉलर

8
बैश मैनुअल के अनुसार sourceएक पर्यायवाची है .
रिचर्ड हैनसेन

1
मैं, जब इस तरह entrypoint के साथ एक डोकर कंटेनर का उपयोग कर इस में आए /bin/sh -c '/path/to/script.sh'। भले ही मेरी स्क्रिप्ट एक बैश स्क्रिप्ट थी, लेकिन स्रोत निर्यात करने में विफल रहे। परंतु "।" काम किया!
निखिल ओवलेकर

31

उबंटू में यदि आप स्क्रिप्ट को निष्पादित करते हैं तो आपको sh scriptname.shयह समस्या आती है।

./scriptname.shइसके बजाय स्क्रिप्ट को निष्पादित करने का प्रयास करें ।


ऐसा करते समय मुझे एक विभाजन दोष मिला।
अधिकतम प्लीनर

1
फ़ाइल निष्पादन योग्य होनी चाहिए:chmod +x filename.sh
रैंडी

2
किसी भी विचार यह क्यों है?
युवल एडम

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