मुख्य बिंदु यह है: एक्सटेंशन किसी भी यूनिक्स जैसी प्रणाली प्रणाली में अप्रासंगिक हैं। फ़ाइल नाम सिर्फ नाम है और इसका कोई प्रभाव नहीं है कि स्क्रिप्ट या संकलित निष्पादन योग्य चल सकता है या नहीं । एक प्रोग्रामर यह बताने के लिए एक .sh
एक्सटेंशन जोड़ सकता है कि एक फ़ाइल शेल स्क्रिप्ट है, या .py
अजगर स्क्रिप्ट के लिए, लेकिन विंडोज के विपरीत, कोई भी यूनिक्स नामकरण के बारे में परवाह नहीं करता है, यह अनुमतियों के बारे में परवाह करता है।
किसी फ़ाइल के लिए दी गई निष्पादन योग्य अनुमति क्या मायने रखती है। जिसे आप चेक कर सकते हैं
ls -l /path/to/file
निष्पादन योग्य चल रहे हैं
स्क्रिप्ट चलाने के लिए आम तौर पर कई तरीके होते हैं।
- यदि आपकी वर्तमान निर्देशिका स्क्रिप्ट के समान है, और स्क्रिप्ट के पास निष्पादन योग्य अनुमतियाँ हैं, तो आप इसे इस तरह से चला सकते हैं
./my_script_name
। .
वर्तमान निर्देशिका का मतलब है।
- यदि आपकी वर्तमान निर्देशिका अलग है और स्क्रिप्ट में निष्पादन योग्य अनुमतियाँ हैं, तो आप इसे पूर्ण पथ निर्दिष्ट करके चला सकते हैं:
/home/user/bin/my_script_name
(उपर्युक्त दो विधियाँ निष्पादन योग्य अनुमति सेट पर निर्भर करती हैं; चाहे फ़ाइल $PATH
चर का हिस्सा हो या न हो , अप्रासंगिक है। #!
लाइन की उपस्थिति भी मायने रखती है, इसके बिना, यह स्क्रिप्ट आपके द्वारा खोले गए वर्तमान शेल द्वारा निष्पादित की जाएगी। यदि मेरे पास csh
स्क्रिप्ट है। उस लाइन के बिना, और इसे साथ में चलाने की कोशिश करें ./my_script.csh
, यह विफल हो जाएगा)
- यदि आपकी स्क्रिप्ट निर्देशिका में स्थित है जो आपके
$PATH
चर का हिस्सा है , तो आप इसे केवल नाम से बुला सकते हैं। आप chmod
कमांड लाइन में कमांड को केवल उसका नाम लिखकर कॉल कर सकते हैं क्योंकि यह /bin
फ़ोल्डर में है। /bin
हमेशा $PATH
चर का हिस्सा है । इस मामले में निष्पादन योग्य अनुमतियाँ और स्क्रिप्ट मामले का स्थान
- एक व्याख्याकार को कमांड और स्क्रिप्ट को तर्क के रूप में निर्दिष्ट करना। इस तरह स्क्रिप्ट दुभाषिया को इनपुट फ़ाइल के रूप में काम करेगी।
- एक फ़ाइल सोर्सिंग।
. filename.sh
या source filename.sh
स्क्रिप्ट का इलाज किया जा के रूप में अगर यह कीबोर्ड इनपुट, यानी था जैसे कि यह कमांड लाइन में सीधे टाइप किया गया था कर देगा। इस मामले में निष्पादन योग्य अनुमति और स्थान मायने नहीं रखते
उदाहरण
उदाहरण # 1, अनुमतियों को निष्पादित करने के लिए दुभाषिया के साथ चल रहा है
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
उदाहरण # 2, ./
निष्पादन योग्य अनुमति सेट, शबंग लाइन सेट के साथ चल रहा है ।
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
उदाहरण # 3, शेबंग लाइन सेट के बिना चल रहा है (विफल रहता है, क्योंकि बैश अजगर स्क्रिप्ट नहीं पढ़ सकता है; कोई भी शेब लाइन लाइन चालू शेल को दुभाषिया नहीं मानता है)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
उदाहरण # 4, चल स्क्रिप्ट जिसमें निष्पादन योग्य अनुमतियाँ सेट फ़ोल्डर हैं जो $PATH
चर का हिस्सा है
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
उदाहरण # 5, एक्सटेंशन निकालना, अभी भी चलता है क्योंकि एक्सटेंशन कोई फर्क नहीं पड़ता, लेकिन इसकी अनुमति है और इसका हिस्सा है $PATH
:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.sh
विस्तार के रूप में उपयोग करना कई परिस्थितियों में बुरा अभ्यास माना जाता है: यह विपरीत है कि अन्य आदेशों का नाम कैसे रखा जाता है (आप नहीं चलाते हैंls.elf
), यह अक्सर भ्रामकfoo.sh
होता है (यदि आपकी शुरुआत होती है#!/bin/bash
, तोsh foo.sh
इसे चलाने के लिए इसे बनाने की तुलना में एक अलग दुभाषिया के साथ चलेगा। ), और यदि आपfoo.sh
एक पायथन प्रोग्राम होने के लिए फिर से लिखते हैं, तो उस एक्सटेंशन का उपयोग करने का मतलब है कि आपको अब-भ्रामक नाम रखने और उसे कॉल करने वाले प्रत्येक प्रोग्राम को फिर से लिखने के बीच चुनने की आवश्यकता है।