जवाबों:
यदि तुम प्रयोग करते हो
sh ./<script>.run
/bin/sh
(आमतौर पर एक बॉर्न शेल) का उपयोग स्क्रिप्ट को चलाने के लिए किया जाएगा। बेशक यह केवल तभी काम करता है जब स्क्रिप्ट बॉर्न शेल के लिए लिखी गई हो। कभी-कभी लिनक्स के लिए शेल स्क्रिप्ट को बॉर्न शेल के बजाय बैश की आवश्यकता होती है, इसलिए शेल स्क्रिप्ट होने पर भी यह काम नहीं कर सकता है।
यदि तुम प्रयोग करते हो
./<script>.run
कर्नेल शेबांग लाइन को देखता है ताकि पता लगाया जा सके कि प्रोग्राम को चलाने के लिए किस प्रोग्राम का उपयोग करना है। तो यह काम करता है भले ही यह बैश, पर्ल, पायथन या कोई अन्य स्क्रिप्ट हो।
इस प्रकार यह आमतौर पर स्क्रिप्ट चलाने का पसंदीदा तरीका है।
जब तक यह sh
(डैश, या समतुल्य) शेल स्क्रिप्ट नहीं है, तब तक कोई बाहरी अंतर नहीं है।
समस्या की .run
गारंटी नहीं है कि मामला है। यह बाइनरी हो सकता है। यह बैश या पायथन या पीएचपी या जो कुछ भी हो सकता है; उन सभी के पास शेल स्क्रिप्ट हैश-बैंग है। यदि आप आँख बंद करके इसके माध्यम से मजबूर करते हैं sh
, जो जानता है कि क्या हो सकता है यह शायद त्रुटि-रहित होगा, लेकिन यह गलती से उस दूर होने से पहले हानिकारक कोड चला सकता है।
chmod
इसे डिंग करके (निष्पादन की अनुमति बिट को सक्षम करने के लिए) और फिर इसे चलाने पर ./script.run
, आप इसे चलाने की सर्वोत्तम संभव संभावना देते हैं। यदि यह एक शेल स्क्रिप्ट है, तो इसके हैश-बैंग को ठीक से पार्स किया जाएगा और यदि यह एक द्विआधारी निष्पादन योग्य है, तो यह केवल मूल रूप से चलेगा।
दो विधियां अक्सर एक ही कार्य कर सकती हैं लेकिन बहुत अलग हैं।
sh ./script
sh
एक तर्क के साथ कमांड चलाता है ./script
, जो दी गई स्क्रिप्ट को निष्पादित करने के लिए होता है .. भले ही स्क्रिप्ट वास्तव में sh
स्क्रिप्ट (खराब) न हो
./script
दी गई फ़ाइल निष्पादित करता है। यह "शेबंग" लाइन की खोज करके निर्धारित करता है कि किस कमांड को चलाना है। यदि अनिर्दिष्ट इसका उपयोग किया जाता है sh
(यह दो विधियाँ कभी-कभी समान कार्य करती हैं), लेकिन अक्सर एक अलग दुभाषिया निर्दिष्ट किया जाता है ।।
उदाहरण के लिए, यदि filename
निम्नलिखित शामिल हैं:
#!/usr/bin/python
print "This is a Python script!"
.. फिर दोनों आज्ञाएँ बहुत अलग हैं:
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
अगर कोई शेबांग लाइन नहीं है, तो दोनों एक ही हैं:
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
एक महत्वपूर्ण अंतर यह है कि आपकी हैशबैंग लाइन में पैरामीटर हैं। उदाहरण के लिए, यदि स्क्रिप्ट के साथ शुरू होता है
#!/bin/bash -e
... और आप इसे बाहरी रूप से चलाते हैं sh
या bash
, उस लाइन को एक टिप्पणी के रूप में व्याख्या किया जाएगा और इसे अनदेखा किया जाएगा, इसलिए -e
पैरामीटर (असफलता पर बाहर) संसाधित नहीं किया जाएगा। इसलिए, निम्नलिखित स्क्रिप्ट दी गई है:
#!/bin/bash -e
echo Hello
false
echo goodbye
के लिए उत्पादन ./script
किया जाएगा सिर्फ "हैलो", लेकिन के लिए उत्पादन sh script
किया जाएगा Hello
, जिसके बाद goodbye
, जो शायद इरादा नहीं था।
यह, वैसे भी, आपको हमेशा एक अलग set -e
कथन का उपयोग करना चाहिए (यह वैसे भी एक अच्छा विचार है - अधिक बार नहीं, यदि कोई समस्या मध्य-स्क्रिप्ट है, तो आप इसे अनदेखा नहीं करना चाहेंगे)।