मुझे .sh फ़ाइलों को चलाने से पहले श की आवश्यकता क्यों है?


16

जब मैं .shटर्मिनल में फाइलें चलाना चाहता हूं , तो मुझे shउनके सामने रखने की जरूरत है ।

क्या इससे बचने का कोई तरीका है, और इस प्रकार टाइपिंग को बचा सकते हैं?


3
मैंने अपनी शेल स्क्रिप्ट को डालने के लिए ~ / बिन पर एक फ़ोल्डर बनाया और इसे अपने $ PATH पर रखा और स्वचालित रूप से निष्पादित अनुमतियों को सेट करने के लिए ~ / बिन फ़ोल्डर में एक फ़ोल्डर एक्शन भी संलग्न किया क्योंकि ऐसा करना आसान है।
कायडेल

जवाबों:


22

यदि आप अपनी स्क्रिप्ट शेल से चला रहे हैं, तो आपको वास्तव #!/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

रखना '।' शुरुआत के बजाय $ PATH के अंत में और अब आपको एक प्रेत 'ls' के बारे में चिंता करने की आवश्यकता नहीं है। (हालांकि अगर कोई आपके सिस्टम में आ सकता है, तो आपको बड़े मुद्दे मिल गए हैं।)
टीजे लुओमा

2
@TJ, लेकिन आप करते हैं की तरह सामान के बारे में चिंता करने की जरूरत है slया llsया l... यानी, लेखन। बस .बाहर छोड़ दो $PATH। इसके अलावा, आप अपने सिस्टम पर सभी पर भरोसा नहीं कर सकते (या नहीं करना चाहिए)। उदाहरण के लिए, वहाँ कुछ फायदा उठाने कि कुछ निर्देशिका में एक मनमाना फ़ाइल ड्रॉप करने एक हमलावर की अनुमति देता है लगता है, लेकिन किसी की जरूरत है आप के लिए आगे बढ़ाने के लिए आदेश में उस फ़ाइल को निष्पादित करने के लिए एक बेहतर दोहन (जैसे, कलेक्ट डेटा और फोन घर)। गहन सुरक्षा!
रीड

@TJLuoma @Reid ने क्या कहा, प्लस ध्यान रखें कि एक निजी OS X डेस्कटॉप से ​​परे एक यूनिक्स प्रणाली के लिए कई उपयोग मामले हैं। यह कोशिश नहीं की है, लेकिन मैं शर्त लगा सकता हूँ कि अतिथि खाता उन वस्तुओं में से एक /tmpया किसी अन्य विश्व-लेखन निर्देशिका में छोड़ सकता है ।
zigg

यदि आप एक ऐसी प्रणाली का उपयोग कर रहे हैं जहां अन्य लोग आपके द्वारा उपयोग की जाने वाली निर्देशिकाओं तक पहुंच रखते हैं, तो आपको बड़े मुद्दे मिलेंगे।
टीजे लुओमा

@TJLuoma आप किसी भी यूनिक्स प्रणाली पर कई खातों का उपयोग कभी नहीं करेंगे। /tmpऔर अन्य। क्षेत्र के साथ आओ।
जिग

10

shयदि स्क्रिप्ट फ़ाइल निष्पादन योग्य के रूप में चिह्नित है, तो आपको कॉल करने की आवश्यकता नहीं है। उस स्थिति में, आप इसे मेरे नाम के समान कह सकते हैं, जैसे आप मौजूदा शेल से कोई अन्य कमांड।


पूरी तरह से उचित होने के लिए, आप दो काम करना चाहेंगे:

  1. अपनी स्क्रिप्ट को अपनी स्क्रिप्ट के शीर्ष पर एक शेबेंग निर्देश शामिल करने के लिए संपादित करें :

    #!/bin/sh

    ... यह शेल को बताएगा कि स्क्रिप्ट को चलाने के लिए कौन से दुभाषिया का उपयोग करना है; इस मामले में, /bin/shनिष्पादन योग्य।

  2. स्क्रिप्ट को आपके द्वारा चोदॉड कमांड के साथ निष्पादन योग्य के रूप में चिह्नित करें :

    chmod u+x scriptname.sh

एक बार जब आप उन दोनों को करते हैं, तो आपको कमांड लाइन पर अपनी स्क्रिप्ट का फ़ाइल नाम टाइप करके अपनी स्क्रिप्ट चलाने में सक्षम होना चाहिए। आपको अपनी स्क्रिप्ट के समान निर्देशिका में रहने की आवश्यकता होगी, जब तक कि आप अपने PATH चर वाले फ़ोल्डर को जोड़ने का जोड़ा कदम नहीं उठाते । अगर आपको परवाह नहीं है कि शेल किस स्क्रिप्ट को चलाता है, तो आपको निर्दिष्ट करने के लिए चरण एक की आवश्यकता नहीं है, shलेकिन अक्सर सटीक होना बेहतर है और "शीबंग" सेट करें।


शेबंग वास्तव में आवश्यक नहीं हैं /bin/sh, हालांकि वे चोट नहीं पहुंचाते हैं।
जिग

@ झीग - आप सही हैं। मुझे आशा है कि क्रिस मेरे संपादन मन नहीं करता है ... Nuke या पुन: संपादित के रूप में वांछित: -0
bmike

@bmike मेरे लिए संपादन कार्य करता है। शेबबैंग्स के लिए, मेरी आदत हमेशा निर्दिष्ट थी क्योंकि मैं kshएचपी-यूएक्स पर अपने दिनों में बहुत सारी स्क्रिप्ट लिखता था - लेकिन यह जानना अच्छा है कि यह कड़ाई से आवश्यक नहीं है।
क्रिस डब्ल्यू। री।

1
मुझे लगता है कि मुझे शेबंग आवश्यकता के बारे में अपने पहले के बयान से पीछे हटने की जरूरत है (हालांकि मेरा जवाब बाकी है।) आप शेल से एक शेलबैंग-कम स्क्रिप्ट चला सकते हैं, लेकिन यदि आप एक execsyscall का उपयोग करते हैं , तो आपको प्राप्त होता है ENOEXEC(निष्पादन प्रारूप त्रुटि )। इसके बारे में क्षमा करें, @bmike, @ ChrisW.Rea। मैं अब अपना उत्तर संपादित करने जा रहा हूं।
zigg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.