./ बनाम। टर्मिनल के तहत कार्यक्रम चलाने के लिए


13

हमें टर्मिनल के तहत निष्पादन के तरीके को चलाने के बारे में कुछ स्पष्टीकरण की आवश्यकता होगी। यह एक लंगड़ा सवाल हो सकता है लेकिन एक निष्पादन योग्य के साथ चलने के बीच क्या अंतर है ./an_executableऔर . an_executable(मान लीजिए कि हम dir में हैं जहां a_executable स्थित है)

मुझे पहले से ही पता है कि पूर्व मौजूदा निर्देशिका ( .) में a_executable के लिए खोल दिखता है , लेकिन बाद वाले संस्करण का उपयोग /करने के बाद इसकी आवश्यकता क्यों नहीं है .?

अग्रिम में धन्यवाद।


यह भी देखें askubuntu.com/q/182012/26972
ysap

जवाबों:


22

. 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कमांड प्रॉम्प्ट पर टाइप करने के बराबर है ।


वास्तव में, मैं शेल स्क्रिप्ट के साथ काम कर रहा था जब मैंने इस व्यवहार पर ध्यान दिया। बहुत बहुत धन्यवाद, मैं जवाब की जरूरत है thats। :)
zipzap

एक और सवाल उठाया गया (अगर आपको कोई आपत्ति नहीं है): यदि मेरी स्क्रिप्ट में प्रतिध्वनि के साथ कुछ सरल संदेश हैं, और मैं इसे ./script के साथ चला रहा हूं, तो मैं अभिभावक के खोल में संदेशों को देखने में सक्षम हूं, यदि सबस्क्रिप्शन बंद हो जाती है जैसे ही निष्पादन समाप्त होता है?
zipzap

2
क्योंकि जब सबस्क्रिप्शन एक अलग प्रक्रिया होती है , तो यह एक ही टर्मिनल को इनवोकिंग शेल के रूप में उपयोग करता है । यह समान है कि आप अभी भी lsआउटपुट कैसे देख पा रहे हैं : आप कमांड टाइप करते हैं, यह रन करता है, आउटपुट दिखाता है और फिर समाप्त हो जाता है, लेकिन आउटपुट टर्मिनल में रहता है।
रोडमैर

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

1
@ डेविड ने इसका उल्लेख किया है :) "सोर्सिंग केवल" रन "(या रनिंग लगता है) शेल स्क्रिप्ट होगी।"
22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.