. executableवाक्य रचना बस किसी भी निष्पादन के साथ काम नहीं है (या यह करता है?)। इसके बजाय, यह बैश sourceबिल-इन के लिए एक उपनाम है। इसलिए अंतर ज्यादातर पटक पटकने के लिए प्रासंगिक है, और सच्चाई यह है कि वे पूरी तरह से अलग चीजें हैं :)
./executableनिष्पादन योग्य "सामान्य रूप से" चलाने के लिए कहता है। ./वर्तमान पथ के लिए एक सापेक्ष संदर्भ है। यह होने से बचा जाता है कि शेल (बैश) अपने में एक निर्देशिका में निष्पादन योग्य का पता लगाने की कोशिश करता है $PATH(जो ऐसा होगा यदि आप कमांड के साथ बिल्कुल भी एक पथ निर्दिष्ट नहीं करते हैं)। आप बस ऐसा क्यों नहीं कर सकते इसका कारण executableसुरक्षा है; कल्पना कीजिए कि आपने एक संग्रह को डाउनलोड किया है और इसमें दुर्भावनापूर्ण संस्करण है ls। यदि यह आपकी वर्तमान निर्देशिका से सीधे चलता है, तो आप उस संस्करण को साकार किए बिना चलाएंगे।
दूसरी ओर, . executable"स्रोत एक फ़ाइल नाम executable" कह रहा है । चूंकि आप सीधे फ़ाइल का नामकरण कर रहे हैं और यह वास्तव में एक निष्पादन योग्य नहीं है, इसलिए $ PATH के लिए सुरक्षा प्रतिबंध लागू नहीं होता है। सोर्सिंग केवल शेल स्क्रिप्ट्स "रन" (या रनिंग लगती है) होगी। यह क्या करता है:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
तो ... वास्तव में निष्पादन और सोर्सिंग के बीच अंतर क्या है? समान शेल स्क्रिप्ट को मानते हुए, इसे निष्पादित करने ( ./script) एक नए शेल को स्पॉन करेगा, स्क्रिप्ट को उस शेल के अंदर चलाएं, और जब स्क्रिप्ट बाहर निकलती है, तो उस शेल को बंद करें और मूल शेल पर वापस लौटें। वास्तव में, यह bashस्क्रिप्ट को निष्पादित करने के लिए एक नई प्रक्रिया शुरू करेगा )।
( . script) वर्तमान शेल को फ़ाइल से कमांड पढ़ने के लिए प्रेरित करेगा जैसे कि उन्हें कमांड लाइन में टाइप किया जा रहा हो। कोई नया खोल नहीं है।
यह देखने का एक बहुत आसान तरीका है कि यह एक स्क्रिप्ट को लिखने के लिए कैसे व्यवहार करता है जिसमें केवल शामिल है exit। यदि आप ./scriptइसे करते हैं, तो कुछ भी नहीं प्रतीत होता है, ऐसा इसलिए है क्योंकि एक नई शेल प्रक्रिया शुरू की जाती है, exitकमांड यह कहती है कि नया शेल और आपका वर्तमान शेल अप्रभावित है।
यदि आप . script, आप वर्तमान टर्मिनल बंद कर देंगे, क्योंकि exitवर्तमान शेल में कमांड चलता है। तो यह exitकमांड प्रॉम्प्ट पर टाइप करने के बराबर है ।