जवाबों:
आपकी विशिष्ट स्क्रिप्ट के लिए या तो रास्ता काम करेगा, सिवाय इसके कि ./script.sh
निष्पादन और पठनीय बिट्स की bash script.sh
आवश्यकता होती है , जबकि केवल पठनीय बिट की आवश्यकता होती है।
अनुमतियों की आवश्यकता के अंतर का कारण आपकी स्क्रिप्ट की व्याख्या करने वाले प्रोग्राम को कैसे लोड किया गया है:
./script.sh
आपके शेल को फ़ाइल चलाने के रूप में अगर यह एक नियमित निष्पादन योग्य था बनाता है।शेल खुद को कांटा करता है और execve
फोर्क्ड प्रक्रिया में ऑपरेटिंग सिस्टम को निष्पादित करने के लिए सिस्टम कॉल (जैसे ) का उपयोग करता है । ऑपरेटिंग सिस्टम फ़ाइल की अनुमतियों की जांच करेगा (इसलिए निष्पादन बिट सेट करने की आवश्यकता है) और प्रोग्राम लोडर के अनुरोध को अग्रेषित करता है , जो फ़ाइल को देखता है और निर्धारित करता है कि इसे कैसे निष्पादित किया जाए। लिनक्स में संकलित निष्पादनयोग्य एक ईएलएफ मैजिक नंबर से शुरू होते हैं, जबकि स्क्रिप्ट एक #!
( हैशबैंग ) से शुरू होती हैं । हैशबैंग हेडर का मतलब है कि फाइल एक स्क्रिप्ट है और हैशबैंग के बाद निर्दिष्ट प्रोग्राम द्वारा व्याख्या की जानी चाहिए। यह स्क्रिप्ट को सिस्टम को यह बताने की अनुमति देता है कि स्क्रिप्ट की व्याख्या कैसे की जाए।
आपकी स्क्रिप्ट के साथ, प्रोग्राम लोडर कमांड-लाइन तर्क के रूप में निष्पादित /bin/bash
और पारित करेगा ./script.sh
।
bash script.sh
कमांड-लाइन तर्क के रूप में आपका शेल रन bash
और पास script.sh
करता हैतो ऑपरेटिंग सिस्टम लोड हो जाएगा bash
(यहां तक कि नहीं देख रहा है script.sh
, क्योंकि यह सिर्फ एक कमांड-लाइन तर्क है)। बनाई गई bash
प्रक्रिया तब व्याख्या करेगी script.sh
क्योंकि यह कमांड-लाइन तर्क के रूप में पारित हो गया है। क्योंकि script.sh
केवल bash
एक नियमित फ़ाइल के रूप में पढ़ा जाता है , निष्पादन बिट की आवश्यकता नहीं है।
मैं ./script.sh
हालांकि उपयोग करने की सलाह देता हूं , क्योंकि आपको नहीं पता होगा कि स्क्रिप्ट की व्याख्या करने वाले को कौन सी आवश्यकता है। तो प्रोग्राम लोडर को आपके लिए निर्धारित करने दें।
. ./script.sh
एक ही बात नहीं है bash script.sh
(या ./script.sh
स्क्रिप्ट पर विचार करें #!/usr/bin/python -V
<newline> print test
।
. script.sh
। लेकिन मैं उन लोगों से सहमत हूं, जो .
स्क्रिप्ट पर कमांड का उपयोग करने को हतोत्साहित करते हैं जो कि उस तरह से लागू होने के लिए नहीं थे। मुझे आश्चर्य है कि किसी ने भी इसका उल्लेख नहीं किया है, यदि स्क्रिप्ट में exit
कमांड हैं, और आप इसे स्रोत करते हैं, तो यह आपको लॉग आउट कर सकता है। एक कम गंभीर समस्या यह होगी कि यदि स्क्रिप्ट ए करता है cd
, क्योंकि यह माता-पिता (इंटरैक्टिव) शेल को भी प्रभावित करेगा।
bash script.sh
सीधे बैश का उपयोग करके स्क्रिप्ट को आमंत्रित करता है। निष्पादित करने के तरीके को निर्धारित करने के लिए
./script.sh
शेबंग का उपयोग कर रहा है #!/bin/bash
।
यदि आप वास्तव में जानना चाहते हैं, तो यदि आप ऐसा करते हैं तो बाइनरी निष्पादित bash script.sh
होती है which bash
।
तो आपके उदाहरण में इससे कोई फर्क नहीं पड़ता। हां, आपको chmod +x script.sh
इसे सीधे निष्पादित करने में सक्षम होना होगा ./script.sh
।
/bin/bash
यह bash
आपके में पहला है $PATH
।
#!/bin/bash
/bin/bash
./script.sh
।
इस तरह से एक फ़ाइल Delete_Self.sh बनाएँ:
#!/bin/rm
echo I am still here!
इस स्क्रिप्ट को चलाएं क्योंकि sh Delete_Self.sh
आप देखेंगे कि "मैं अभी भी यहाँ हूँ!" गूँज उठा।
इसे निष्पादन योग्य बनाएं, और इसे चलाएं जैसा कि ./Delete_Self.sh
आप देखेंगे कि कुछ भी वापस नहीं गूंज रहा है, जबकि फ़ाइल Delete_Self.sh
स्वयं चली गई है।
तो अंतर यह है कि:
bash script.sh
# की अनदेखी करेंगे! लाइन, क्योंकि bash को स्क्रिप्ट चलाने के कार्यक्रम के रूप में निर्दिष्ट किया गया है।./script.sh
# पढ़ लेंगे! चलाने के लिए कार्यक्रम निर्धारित करने के लिए लाइन script.sh
।अन्य उत्तरों के अलावा, ./script.sh
(i) और स्रोत ./script.sh
(ii) के माध्यम से स्क्रिप्ट चलाने के बीच के अंतर को जानना उपयोगी है - (i) संस्करण कमांड को चलाने के लिए एक नया शेल बनाता है, जबकि (ii) इसे चलाता है। वर्तमान शेल - जो अनिवार्य हो सकता है अगर निष्पादन योग्य परिवर्तन पर्यावरण चर जो निष्पादन योग्य निकास के बाद संरक्षित किए जाने की आवश्यकता है। उदाहरण के लिए, एक अजगर कोंडा पर्यावरण को सक्रिय करने के लिए निम्नलिखित का उपयोग किया जाना चाहिए:
source activate my_env
एनबी एक और विकल्प है source
जिसका आप सामना कर सकते हैं वह है .
बिलिन, यानी
. activate my_env