2017-08-18 16 views
5

मुझे पता है कि source और . वही काम करते हैं, और मुझे यह जानकर आश्चर्य होगा कि शीर्षक में कमांड के अन्य जोड़े एक ही चीज़ नहीं हैं (क्योंकि मैं अपने खोल के रूप में बैश चला रहा हूं, $SHELL [script] और bash [script] बराबर हैं, है ना ??)।

तो स्क्रिप्ट निष्पादित करने के तीन तरीकों के बीच क्या अंतर है? मैं पूछ रहा हूं क्योंकि मैंने अभी सीखा है कि एक स्क्रिप्ट सोर्सिंग NOT the exact same इसे निष्पादित करने के रूप में है। इस तरह से मुझे अपने "प्रयोगों" को चलाने और मैन पेज पढ़ने से स्पष्ट नहीं मिला।

अन्य सूक्ष्म मतभेद क्या हैं जो मुझे इन कार्यों को अविश्वसनीय रूप से सरल लिपियों पर बुलाकर नहीं मिला? उपर्युक्त उत्तर पढ़ने के बाद, मैं दृढ़ता से अनुमान लगा सकता हूं कि मेरे प्रश्न का उत्तर काफी सरल व्याख्या होगा, लेकिन इस तरह से मैं लगभग पूरी तरह से अपने आप को कभी नहीं खोजूंगा।

यहाँ "प्रयोग" है मैंने किया:

$. myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$source myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$bash myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$$SHELL myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$./myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

उत्तर

10

. script और source script एक subshell बनाए बिना वर्तमान वातावरण, अर्थात में scriptकी सामग्री को निष्पादित करें। उल्टा पर यह वर्तमान वातावरण को प्रभावित करने के लिए script की अनुमति देता है, उदाहरण के लिए पर्यावरण चर बदलना या वर्तमान कार्य निर्देशिका को बदलना। डाउनसाइड पर यह वर्तमान वातावरण को प्रभावित करने के लिए script की अनुमति देता है, जो एक संभावित सुरक्षा खतरे है।

bash scriptscriptbash निष्पादित करने के लिए दुभाषिया को पास करता है। जो भी शेबांग script द्वारा दिया जाता है उसे स्वयं अनदेखा किया जाता है। ("मामला" script की पहली पंक्ति है, जो जैसे #!/bin/bash, या #!/usr/bin/perl, या #!/usr/bin/awk, पढ़ सकता है दुभाषिया निर्दिष्ट करने के लिए प्रयोग की जाने वाली का जिक्र है।)

$SHELL script गुजरता scriptलिए जो कुछ भी करने के लिए अपने वर्तमान खोल दुभाषिया है निष्पादित। यह हो सकता है, या नहीं, bash हो सकता है। (वातावरण चर SHELL, अपने वर्तमान खोल दुभाषिया के नाम रखती है। $SHELL अगर बैश चल रहा है, पिछले पैराग्राफ में दिए गए विवरण प्रभाव के साथ, /bin/bash लिए मूल्यांकन किया जाता है।)

./script एक फ़ाइल की सामग्री में scriptकार्यान्वित वर्तमान कार्य निर्देशिका। अगर ऐसी कोई फ़ाइल नहीं है, तो एक त्रुटि उत्पन्न होती है। $PATH की सामग्री का क्या असर होता है इसका कोई प्रभाव नहीं पड़ता है।

script एक फ़ाइल script$PATH में सूचीबद्ध निर्देशिका है, जो या वर्तमान काम निर्देशिका में शामिल नहीं हो सकता है के लिए लग रहा है। निर्देशिकाओं की इस सूची में पाया गया पहला script निष्पादित किया गया है, जो आपकी वर्तमान कार्य निर्देशिका में से एक हो सकता है या नहीं।

+0

आह, धन्यवाद! तो मैं एक अलग खोल (कह सकता हूं, सीएसएच) चला सकता हूं, और अभी भी 'bash [script]' कॉल कर सकता हूं। शेबांग के बारे में जोड़ा गया हिस्सा दिलचस्प था! तो "$ SHELL [स्क्रिप्ट]" शेबैंग को अनदेखा भी करेगा। एक और चीज जिसे मैंने अभी महसूस किया था, यह था कि मेरे प्रयोगों को चलाने के दौरान मैं जिस निर्देशिका में था, वह मेरे $ PATH चर में था। अगर ऐसा नहीं होता, तो "[स्क्रिप्ट]" बस काम नहीं करता। वाह।इस तरह के एक समान उत्पादन के लिए मतभेदों का एक टन है। –

+1

@AriSweedler: यह सही है। ध्यान दें कि कुछ टूल * आपके वर्तमान खोल को अनदेखा करते हैं, और डिफ़ॉल्ट रूप से '/ bin/sh' तक * जब तक स्पष्ट रूप से * अन्यथा नहीं बताया जाता है (उदाहरण के लिए crontab और बनाना)। – DevSolar

+1

टिप्पणियां: 'स्रोत' एक बशर्मी है,'। 'पॉज़िक्स है; '$ SHELL' आपके खोल के अलावा किसी अन्य चीज़ में विस्तारित हो सकता है (उदाहरण के लिए, डैश चलाने पर यह'/bin/bash' है)। –

संबंधित मुद्दे