2009-05-28 16 views
19

एक यूनिक्स कमांड लाइन पर, प्रोग्राम को निष्पादित करने के बीच क्या अंतर है, बस इसे टाइप करके प्रोग्राम को निष्पादित करने के बीच क्या अंतर है। (डॉट) कार्यक्रम के नाम के बाद? उदा .:यूनिक्स कमांड लाइन के साथ निष्पादित करें। (डॉट) बनाम

runme 

बनाम

. runme 
+0

यदि मैं पुटी टर्मिनल में दूसरा करता हूं, तो यह बंद हो जाता है ... – schnaader

+0

संबंधित: http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash- स्क्रिप्ट -और-सोर्सिंग-ए-बैश-स्क्रिप/176788 # 176788 – lesmana

उत्तर

24

. name वर्तमान शेल में name नामक फ़ाइल को स्रोत करता है। तो अगर एक फाइल अगर आपको लगता है कि सूत्रों इस

A=hello 

तब होता है, बाद में आप एक चर A कहा जाता है जो हैलो शामिल होंगे देख सकते हैं। लेकिन अगर आप फ़ाइल को निष्पादित, है, तो ऐसी बातों से काम नहीं चलेगा (उचित निष्पादन अधिकारों और #!/interpreter लाइन दिया गया है) के बाद से चर और अन्य चीजें हैं जो स्क्रिप्ट सेट केवल प्रभावित होगा अपने subshell उस में चलाया जाता है।

सोर्सिंग एक द्विआधारी फ़ाइल कोई समझ नहीं लेगी: शैल को बाइनरी सामान की व्याख्या करने के बारे में पता नहीं होगा (याद रखें कि उस फ़ाइल में वर्तमान शेल में दिखाई देने वाली चीजें शामिल हैं - सी में अच्छे पुराने #include <file> तंत्र की तरह)। उदाहरण:

head -c 10 /dev/urandom > foo.sh; . foo.sh # don't do this at home! 
bash: �ǻD$�/�: file or directory not found 

एक बाइनरी फ़ाइल निष्पादित, तथापि, भावना का एक बहुत, निश्चित रूप से पड़ता है। तो आम तौर पर आप उस फ़ाइल को नामित करना चाहते हैं जिसे आप निष्पादित करना चाहते हैं, और विशेष मामलों में, A=hello उपरोक्त मामले की तरह, आप एक फ़ाइल को स्रोत बनाना चाहते हैं।

15

का उपयोग करना "source" या "." वर्तमान प्रक्रिया में चलाने के लिए आदेशों का कारण बनता है। एक निष्पादन योग्य के रूप में स्क्रिप्ट को चलाने से यह अपनी प्रक्रिया देता है।

यह सबसे ज्यादा मायने रखती है अगर आप वर्तमान खोल (जो आपको एक अलग प्रक्रिया में ऐसा नहीं कर सकते) में वातावरण चर सेट करने के लिए कोशिश कर रहे हैं या अपने खोल (निरस्त किया जा रहा है जो आप केवल एक में कर सकते हैं बिना स्क्रिप्ट निरस्त करना चाहते अलग प्रक्रिया)।

+0

उस प्रक्रिया भेद ने मेरे लिए सब कुछ स्पष्ट किया।Dot-command के बारे में लिंक के लिए – Kvass

5

पहले आदेश को निष्पादित करता है। दूसरे के अंदर एक शेल स्क्रिप्ट शामिल करने के लिए दूसरा शॉर्टेंड है।

4

यह वाक्यविन्यास "लोड" और स्क्रिप्ट को पार्स करने के लिए प्रयोग किया जाता है। यह सबसे उपयोगी होता है जब आपके पास ऐसी स्क्रिप्ट होती है जिसमें अन्य स्क्रिप्ट्स के समूह के लिए सामान्य कार्यक्षमता होती है, और आप इसे "इसमें शामिल" कर सकते हैं। विवरण के लिए http://tldp.org/LDP/abs/html/internal.html देखें ("डॉट" कमांड पर नीचे स्क्रॉल करें)।

+0

+1 -> 'यह आदेश, कमांड लाइन से आने पर, एक स्क्रिप्ट निष्पादित करता है। एक स्क्रिप्ट के भीतर, एक स्रोत फ़ाइल-नाम फ़ाइल फ़ाइल-नाम लोड करता है। स्क्रिप्ट में एक फ़ाइल (डॉट-कमांड) आयात कोड को सोर्स करना, स्क्रिप्ट में संलग्न करना (सी प्रोग्राम में # अंतर्निहित निर्देश के समान प्रभाव)। शुद्ध परिणाम वही है जैसे कोड की "सोर्स" लाइनें स्क्रिप्ट के शरीर में भौतिक रूप से मौजूद थीं। यह उन परिस्थितियों में उपयोगी होता है जब एकाधिक स्क्रिप्ट एक सामान्य डेटा फ़ाइल या फ़ंक्शन लाइब्रेरी का उपयोग करती हैं। ' – Levit

4

"रनमे" चलाना एक नई प्रक्रिया तैयार करेगा जो इसके सुखद तरीके से चलेगा और आपके खोल को प्रभावित नहीं करेगा।

"रनमे" चलाना स्क्रिप्ट "रनमे" को आपके पर्यावरण चर बदलने, निर्देशिकाओं को बदलने और अन्य चीजों के सभी प्रकारों को बदलने की अनुमति देगा जो आप चाहते हैं कि आप यह कर सकें। यह केवल ऐसा ही कर सकता है क्योंकि इसका उपयोग शेल प्रक्रिया द्वारा किया जा रहा है जो आपके लिए पहले से चल रहा है। नतीजतन, यदि आप अपने लॉगिन खोल के रूप में बैश चला रहे हैं, तो आप केवल "।" का उपयोग कर सकते हैं। एक बैश स्क्रिप्ट के साथ नोटेशन, उदाहरण के लिए (सी उदाहरण के लिए) सी शेल स्क्रिप्ट पर एक बाइनरी।

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