इसलिए, मुझे लगा कि मुझे इस बारे में अच्छी समझ है, लेकिन बस एक परीक्षण चला (एक बातचीत के जवाब में जहां मैं किसी से असहमत था) और पाया कि मेरी समझ त्रुटिपूर्ण है ...
में संभव के रूप में ज्यादा विस्तार के रूप में वास्तव में क्या होता है क्या जब मैं अपने खोल में एक फ़ाइल को अंजाम? मेरा क्या मतलब है, अगर मैं टाइप करता हूं: ./somefile some arguments
मेरे शेल में और प्रेस रिटर्न (और somefile
सीडब्ल्यूडी में मौजूद है, और मैंने + पर अनुमतियों को पढ़ लिया है somefile
) तो हुड के नीचे क्या होता है?
मुझे लगा कि उत्तर था:
- खोल एक syscall बनाने के लिए
exec
, मार्ग से गुजर रहा हैsomefile
- कर्नेल जांचता है
somefile
और यह निर्धारित करने के लिए फ़ाइल की जादुई संख्या को देखता है कि क्या यह एक प्रारूप है जिसे प्रोसेसर संभाल सकता है - यदि जादू संख्या इंगित करती है कि फ़ाइल एक प्रारूप में है तो प्रोसेसर निष्पादित कर सकता है, फिर
- एक नई प्रक्रिया बनाई गई है (प्रक्रिया तालिका में एक प्रविष्टि के साथ)
somefile
को पढ़ा जाता है / स्मृति में मैप किया जाता है। एक ढेर बन जाता है और निष्पादन के कोड के प्रवेश बिंदु करने के लिए कूदता हैsomefile
, साथARGV
(एक पैरामीटर की एक सरणी के लिए शुरूchar**
,["some","arguments"]
)
- यदि मैजिक नंबर एक शेबंग है, तो
exec()
ऊपर के रूप में एक नई प्रक्रिया पैदा करता है, लेकिन निष्पादन योग्य का उपयोग शेबबैंग द्वारा संदर्भित दुभाषिया होता है (जैसे/bin/bash
या/bin/perl
) औरsomefile
पास किया जाता हैSTDIN
- यदि फ़ाइल में कोई वैध मैजिक नंबर नहीं है, तो "अमान्य फ़ाइल (खराब मैजिक नंबर): त्रुटि प्रारूप त्रुटि" जैसी त्रुटि होती है
हालाँकि किसी ने मुझे बताया कि अगर फ़ाइल सादा पाठ है, तो शेल कमांड निष्पादित करने की कोशिश करता है (जैसे कि मैंने टाइप किया था bash somefile
)। मुझे इस पर विश्वास नहीं हुआ, लेकिन मैंने अभी इसकी कोशिश की, और यह सही था। इसलिए मुझे स्पष्ट रूप से कुछ गलतफहमी है कि वास्तव में यहाँ क्या होता है, और यांत्रिकी को समझना चाहते हैं।
जब मैं अपने शेल में फ़ाइल निष्पादित करता हूं तो वास्तव में क्या होता है? (जैसा कि विस्तार में उचित है ...)
source somefile
./somefile
हालाँकि, एक नई प्रक्रिया से अलग किया जा रहा है , हालांकि।
./somefile
कमांड को निष्पादित करने के लिए बैश होगा somefile
। मैंने सोचा कि यह सिर्फ एक त्रुटि प्रदर्शित करेगा, और इसके बजाय यह प्रभावी रूप से प्रकट होता हैsource somefile
somefile
कोई पाठ फ़ाइल है, तो यदि मैं इसे निष्पादित करने का प्रयास करता हूं, तो एक नया शेल खोल दिया जाता है। echo $$
यदि मैं इसे स्रोत के रूप में निष्पादित करता हूं तो एक फ़ाइल अलग तरह से व्यवहार करती है।