Zsh में एक स्क्रिप्ट निष्पादित करना - फ़ाइल अनुमतियाँ


16

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

मेरे पास एक स्क्रिप्ट फ़ाइल है, सादगी के लिए बस कहा जाता है s, में स्थित है ~/bin। इस उदाहरण के लिए, फ़ाइल में केवल निम्न पंक्तियाँ हैं:

#!/bin/zsh
echo "Test";

बहुत आसान।

मैं करने के लिए नेविगेट ~/binनिर्देशिका, और chmodकी फाइल अनुमति sके लिए 400- यानी, केवल पढ़ने के लिए मुझे के लिए ही। कोई निष्पादन अनुमति नहीं। तो फिर मैं इसकी राह में प्रवेश करते हुए स्क्रिप्ट को निष्पादित करने का प्रयास करता हूं:

% ./s
zsh: permission denied: ./s

अब तक सब ठीक है। गलत अनुमतियों के कारण फ़ाइल को निष्पादित नहीं किया जा सकता है। अनुमतियों को ऊपर ले जाना 500(अनुमति देना निष्पादित करना) भी ठीक काम करता है - इन अनुमतियों के साथ, फ़ाइल ठीक निष्पादित होती है:

% ./s
Test

यह सब उम्मीद के मुताबिक है। लेकिन फिर मैं chmodनीचे अनुमति देता हूं 400(फिर से अनुमति को निष्पादित करें), sourceफ़ाइल को निगलना का प्रयास करें , और ऐसा होता है:

% source s
Test

हालाँकि अनुमतियाँ हैं 400, स्क्रिप्ट निष्पादित करता है।

तो यहाँ मेरा सवाल है: क्यों ./sविफल रहता है (जैसे यह होना चाहिए) लेकिन source sसामान्य रूप से निष्पादित होता है? क्या यह निष्पादन की अनुमति के पूरे उद्देश्य को नहीं हराता है?

पर 400अनुमतियाँ, sh sऔर zsh sभी काम करते हैं।

मुझे यकीन है कि मैं कहीं न कहीं कुछ गलत कर रहा हूं। जहां मेरे लिए किसी बिंदु बाहर कर सकते हैं, और के बीच अंतर की व्याख्या ./s, source s, sh sऔर zsh s?

जवाबों:


17

जब आप चलते हैं ./s, तो आप प्रोग्राम को निष्पादित करने के लिए कर्नेल को बताते हैं s। यदि आपके पास निष्पादन की अनुमति है, तो कर्नेल फ़ाइल के पहले कुछ बाइट्स को पढ़ता है, #!लाइन को देखता है ताकि यह पता चले कि यह एक स्क्रिप्ट है, और दुभाषिया को चलाता है, इसे स्क्रिप्ट नाम को इसके पहले तर्क के रूप में पारित करता है। यदि आपके पास अनुमति निष्पादित नहीं है, तो कर्नेल पहले चरण में निष्पादन को रोक देता है।

जब आप चलाते हैं zsh s, तो आप निष्पादित करते हैं zsh, और इसे बताई गई फ़ाइल को पढ़ने के लिए कहते हैं sऔर इसे कमांड के रूप में व्याख्या करते हैं। आप निष्पादित नहीं sकर रहे हैं, आप निष्पादित कर रहे हैं zsh। के साथ एक ही बात sh sया cat s

जब आप दौड़ते हैं source s, तो फिर से, आप एक फाइल को पढ़ने के लिए zsh को बताते हैं, तो यह क्या मायने रखता है कि आपने इस पर अनुमति पढ़ ली है।


ठीक है, यह समझ में आता है। लेकिन यह पूरी तरह से निष्पादन की अनुमति होने के बिंदु को नहीं हराता है? कोई फर्क नहीं पड़ता कि यह सेट है या नहीं, मैं हमेशा स्क्रिप्ट निष्पादित करने में सक्षम होऊंगा (या स्क्रिप्ट में कमांड्स की व्याख्या करने के लिए zsh बताऊंगा, जो समकक्ष है)।
C106

इसके अलावा, cat sबस फ़ाइल की सामग्री को प्रिंट करता है। cat s | zshउन्हें zshप्रिंट और प्रिंट करता है Test
C106

1
@ C106 निष्पादित अनुमति का बिंदु यह इंगित करना है कि फ़ाइल कुछ ऐसी चीज़ का प्रतिनिधित्व करती है जिसे आप अतिरिक्त जानकारी के बिना निष्पादित कर सकते हैं। यदि फ़ाइल सेतु / सेटगिड है तो यह भी महत्वपूर्ण है। किसी फ़ाइल में निष्पादन की अनुमति नहीं हो सकती है, लेकिन फिर भी निर्देशों से मिलकर बनता है कि ऐसा होता है कि कुछ कंप्यूटर प्रोग्राम कहीं निष्पादित करता है।
गिलेस एसओ- बुराई को रोकना '

यह बहुत समझ में आता है, और वास्तव में वास्तव में अविश्वसनीय रूप से स्पष्ट है। धन्यवाद।
C106
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.