जब मैं .sh
टर्मिनल में फाइलें चलाना चाहता हूं , तो मुझे sh
उनके सामने रखने की जरूरत है ।
क्या इससे बचने का कोई तरीका है, और इस प्रकार टाइपिंग को बचा सकते हैं?
जब मैं .sh
टर्मिनल में फाइलें चलाना चाहता हूं , तो मुझे sh
उनके सामने रखने की जरूरत है ।
क्या इससे बचने का कोई तरीका है, और इस प्रकार टाइपिंग को बचा सकते हैं?
जवाबों:
यदि आप अपनी स्क्रिप्ट शेल से चला रहे हैं, तो आपको वास्तव #!/bin/sh
में इस उत्तर में उल्लिखित के रूप में शेबबैंग की आवश्यकता नहीं है -इस तरह की यूनिक्स-जैसी प्रणाली जिसका मैंने उपयोग किया है, ओएस एक्स सहित, /bin/sh
अगर कोई विशेष रूप से निर्दिष्ट नहीं है तो डिफ़ॉल्ट होगा हालांकि यह एक अच्छा विचार है क्योंकि गैर-गोले को यह नहीं पता होगा कि आप अपनी स्क्रिप्ट को कैसे निष्पादित करें जब तक कि आप शेबंग नहीं देते।)
आपको .sh
एक्सटेंशन की भी आवश्यकता नहीं है । आपको निष्पादन योग्य अनुमतियाँ सेट करने की आवश्यकता है, जैसे
$ chmod +x script.sh
( $
शेल प्रांप्ट है; मैं इसका उपयोग आपको इंटरेक्टिव शेल को दिए गए कमांड्स को चित्रित करने के लिए कर रहा हूँ। इसे टाइप न करें!)
हालाँकि, मुझे लगता है कि आपका भ्रम क्या है कि आपने script.sh
वर्तमान निर्देशिका में एक स्क्रिप्ट बनाई है, उदाहरण के लिए , और बस टाइप करके इसे निष्पादित करने का प्रयास कर रहे हैं script.sh
। जैसे
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
(का ^D
अर्थ है control- Dयूनिक्स का उपयोग करने पर आपको कई राइटअप में यह नोटेशन मिलेगा।)
तथ्य यह है कि script.sh
इस मामले में एक शेल स्क्रिप्ट है केवल आधी समस्या है; आपका वास्तविक मुद्दा यह है कि, डिफ़ॉल्ट रूप से, शेल किसी प्रोग्राम के लिए वर्तमान निर्देशिका को नहीं खोजेगा। हालाँकि, यह काम करता है:
$ sh script.sh
hello, world
क्योंकि sh
स्क्रिप्ट को एक तर्क के रूप में ले रहा है।
आप किसी स्क्रिप्ट को निष्पादित कर सकते हैं - या, फिर से, किसी भी निष्पादन योग्य-वर्तमान निर्देशिका में, यदि यह निष्पादन योग्य (यानी chmod +x
) चिह्नित है, तो यह निर्दिष्ट करके कि आप वर्तमान निर्देशिका में एक को चलाना चाहते हैं:
$ ./script.sh
hello, world
आप स्क्रिप्ट को अपनी निर्देशिका पर स्थानांतरित भी कर सकते हैं PATH
। मैं इसके लिए सलाह /usr/local/bin
देता हूं कि यदि आपकी स्क्रिप्ट का उपयोग सिस्टम-वाइड, या bin
आपके घर में निर्देशिका का उपयोग करने के लिए किया जाता है यदि स्क्रिप्ट केवल आपके लिए है। उत्तरार्द्ध आपको जोड़ने की आवश्यकता है $HOME/bin
, जो आपकी नई बिन निर्देशिका में फैलता है, आपके PATH
द्वारा .profile
अपने घर की निर्देशिका में निम्नलिखित पंक्तियों को जोड़कर :
PATH=$HOME/bin:$PATH
export PATH
अंत में, आप कर सकते हैं, यदि आप चाहते हैं, तो वास्तव में वर्तमान निर्देशिका को अपने में जोड़ें PATH
, जो आपको केवल एक निर्देशिका में जाने की अनुमति देगा जिसमें script.sh
कोई भी अन्य निष्पादन योग्य है और प्रकार
$ script.sh
इसे निष्पादित करने के लिए। हालाँकि, मैं इस अभ्यास की अनुशंसा नहीं करता , क्योंकि एक हमलावर अब आपको एक निष्पादन योग्य स्क्रिप्ट (नाम, कहते हैं, ls
) को एक निर्देशिका में चलाकर एक मनमाना निष्पादन चलाने में धोखा दे सकता है। यदि आप वास्तव में इसे करना चाहते हैं, तो। बस अपने निम्नलिखित जोड़ें .profile
:
PATH=.:$PATH
export PATH
sl
या lls
या l
... यानी, लेखन। बस .
बाहर छोड़ दो $PATH
। इसके अलावा, आप अपने सिस्टम पर सभी पर भरोसा नहीं कर सकते (या नहीं करना चाहिए)। उदाहरण के लिए, वहाँ कुछ फायदा उठाने कि कुछ निर्देशिका में एक मनमाना फ़ाइल ड्रॉप करने एक हमलावर की अनुमति देता है लगता है, लेकिन किसी की जरूरत है आप के लिए आगे बढ़ाने के लिए आदेश में उस फ़ाइल को निष्पादित करने के लिए एक बेहतर दोहन (जैसे, कलेक्ट डेटा और फोन घर)। गहन सुरक्षा!
/tmp
या किसी अन्य विश्व-लेखन निर्देशिका में छोड़ सकता है ।
/tmp
और अन्य। क्षेत्र के साथ आओ।
sh
यदि स्क्रिप्ट फ़ाइल निष्पादन योग्य के रूप में चिह्नित है, तो आपको कॉल करने की आवश्यकता नहीं है। उस स्थिति में, आप इसे मेरे नाम के समान कह सकते हैं, जैसे आप मौजूदा शेल से कोई अन्य कमांड।
पूरी तरह से उचित होने के लिए, आप दो काम करना चाहेंगे:
अपनी स्क्रिप्ट को अपनी स्क्रिप्ट के शीर्ष पर एक शेबेंग निर्देश शामिल करने के लिए संपादित करें :
#!/bin/sh
... यह शेल को बताएगा कि स्क्रिप्ट को चलाने के लिए कौन से दुभाषिया का उपयोग करना है; इस मामले में, /bin/sh
निष्पादन योग्य।
स्क्रिप्ट को आपके द्वारा चोदॉड कमांड के साथ निष्पादन योग्य के रूप में चिह्नित करें :
chmod u+x scriptname.sh
एक बार जब आप उन दोनों को करते हैं, तो आपको कमांड लाइन पर अपनी स्क्रिप्ट का फ़ाइल नाम टाइप करके अपनी स्क्रिप्ट चलाने में सक्षम होना चाहिए। आपको अपनी स्क्रिप्ट के समान निर्देशिका में रहने की आवश्यकता होगी, जब तक कि आप अपने PATH चर वाले फ़ोल्डर को जोड़ने का जोड़ा कदम नहीं उठाते । अगर आपको परवाह नहीं है कि शेल किस स्क्रिप्ट को चलाता है, तो आपको निर्दिष्ट करने के लिए चरण एक की आवश्यकता नहीं है, sh
लेकिन अक्सर सटीक होना बेहतर है और "शीबंग" सेट करें।
/bin/sh
, हालांकि वे चोट नहीं पहुंचाते हैं।
ksh
एचपी-यूएक्स पर अपने दिनों में बहुत सारी स्क्रिप्ट लिखता था - लेकिन यह जानना अच्छा है कि यह कड़ाई से आवश्यक नहीं है।
exec
syscall का उपयोग करते हैं , तो आपको प्राप्त होता है ENOEXEC
(निष्पादन प्रारूप त्रुटि )। इसके बारे में क्षमा करें, @bmike, @ ChrisW.Rea। मैं अब अपना उत्तर संपादित करने जा रहा हूं।