स्क्रिप्ट चलाते समय त्रुटि संदेश 'स्रोत: नहीं मिला'


35

मैं थोड़ी स्वचालित सेटअप स्क्रिप्ट बना रहा हूं जो संशोधित होगी /etc/profileऔर $HOME/.profileयदि कुछ पथ निर्यात नहीं किए जाते हैं। फिर, मैं ये स्वचालित रूप से पुनः लोड करना चाहूंगा।

मैंने पढ़ा है कि sourceयह करता है, इसलिए मैंने अपना टर्मिनल निकाल दिया और प्रवेश किया:

source /etc/profile
source ~/.profile

टर्मिनल से, यह किसी भी त्रुटि का उत्पादन नहीं किया।

हालाँकि, इन दोनों आदेशों को बैश स्क्रिप्ट के अंदर डालने से परिणाम सामने आते हैं source: not found

  1. मुझे कैसे यकीन हो सकता है कि स्क्रिप्ट बैश द्वारा निष्पादित की गई है, भले ही #!/bin/shनिर्दिष्ट हो (जाहिर है, यह इसकी गारंटी नहीं देता है)?
  2. यह क्यों कहेंगे कि ये दोनों स्रोत तब नहीं मिल सकते जब वे असंदिग्ध रूप से वहां मौजूद हों?

जवाबों:


54

/bin/shनहीं है bash। अपनी स्क्रिप्ट को निष्पादित करने के लिए, अपनी स्क्रिप्ट में पहली पंक्ति के रूप में bashलिखें #!/bin/bash

त्रुटि source: not foundनहीं गिराई जाती है, क्योंकि /etc/profileनहीं मिली है। यह गिरा हुआ है, क्योंकि sourceनहीं मिला है। sourceएक बैश बिल्ट-इन फ़ंक्शन है, और आप स्क्रिप्ट को निष्पादित नहीं करते हैं bash। तो यह स्पष्ट है कि यह क्यों नहीं मिला है। #!स्क्रिप्ट में लाइन बदलें , और यह काम करेगा।


9

1. मैं कैसे सुनिश्चित कर सकता हूं कि स्क्रिप्ट बैश द्वारा निष्पादित की गई है, भले ही #!/bin/shनिर्दिष्ट हो (जाहिर है, यह इसकी गारंटी नहीं है)?

यह सुनिश्चित करने के लिए कि shशेल के लिए लिखी गई स्क्रिप्ट (जैसा कि आपके मामले में है - देखें ? #! / Bin / sh और #? / Bin / bash? ) के बीच क्या अंतर है , बस बैश द्वारा निष्पादित किया जाता है, बस निम्नलिखित कमांड चलाएँ:

bash script_name

इस प्रकार, आपको वह त्रुटि अब नहीं मिलेगी।

2. यह क्यों कहेंगे कि ये दोनों स्रोत तब नहीं पाए जा सकते जब वे वहां मौजूद नहीं हैं?

यह नहीं कहा गया है कि वे खट्टी फाइलें नहीं हैं। यह कहता है कि sourceआज्ञा नहीं मिली है। यह सामान्य है, क्योंकि जब से आप अपनी स्क्रिप्ट को #!/bin/shलाइन से शुरू करते हैं , तो आपकी स्क्रिप्ट का उपयोग करना शुरू हो जाएगा, shbashकि जैसा आप सोच सकते हैं। यह सामान्य क्यों है? क्योंकि sourceकमांड बैश बिलिन है, लेकिन shबिलिन नहीं । किसी फ़ाइल को स्रोत में करने के लिए sh, आपको .(डॉट) का उपयोग करना चाहिए । उदाहरण:

. /etc/profile
. ~/.profile

एक और तरीका है कि शेबंग लाइन को बदल दिया जाए #!/bin/bashक्योंकि अराजकता ने उसके जवाब में कहा ।


4

इस SO प्रश्न को देखें :

/bin/shआमतौर पर कुछ अन्य शेल खोल की नकल करने की कोशिश कर रहा है। कई वितरण उपयोग /bin/bashकरते हैं sh, यह स्रोत का समर्थन करता है। हालांकि, उबंटू /bin/dashका उपयोग किया जाता है जो स्रोत का समर्थन नहीं करता है। यदि आप स्क्रिप्ट को संपादित नहीं कर सकते, तो इसे चलाने वाले शेल को बदलने का प्रयास करें।


1

.इसके बजाय कुछ गोले समर्थन करते हैं source। तो आप कुछ इस तरह की कोशिश कर सकते हैं

. filename

के बजाय

source filename

मुझे भरोसा है ये काम करेगा

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