+ X और ./ <script> और sh ./ <script> के बीच अंतर


13

क्या स्क्रिप्ट चलाने के बीच कोई वास्तविक अंतर हैं

[sudo] sh ./<script>.run

के बजाय

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run

जवाबों:


18

यदि तुम प्रयोग करते हो

sh ./<script>.run

/bin/sh(आमतौर पर एक बॉर्न शेल) का उपयोग स्क्रिप्ट को चलाने के लिए किया जाएगा। बेशक यह केवल तभी काम करता है जब स्क्रिप्ट बॉर्न शेल के लिए लिखी गई हो। कभी-कभी लिनक्स के लिए शेल स्क्रिप्ट को बॉर्न शेल के बजाय बैश की आवश्यकता होती है, इसलिए शेल स्क्रिप्ट होने पर भी यह काम नहीं कर सकता है।

यदि तुम प्रयोग करते हो

./<script>.run

कर्नेल शेबांग लाइन को देखता है ताकि पता लगाया जा सके कि प्रोग्राम को चलाने के लिए किस प्रोग्राम का उपयोग करना है। तो यह काम करता है भले ही यह बैश, पर्ल, पायथन या कोई अन्य स्क्रिप्ट हो।

इस प्रकार यह आमतौर पर स्क्रिप्ट चलाने का पसंदीदा तरीका है।


1
जैसा कि मैंने olis के उत्तर में कहा था: मैंने निष्पादन योग्य की जाँच की मैं उसके / बिन / श को चलाने के लिए उसकी शायद ठीक है, बीमार प्रतीक्षा करें और देखें कि क्या किसी के पास कोई अन्य जानकारी है और फिर उत्तर स्वीकार करें
user36976

7

जब तक यह sh(डैश, या समतुल्य) शेल स्क्रिप्ट नहीं है, तब तक कोई बाहरी अंतर नहीं है।

समस्या की .runगारंटी नहीं है कि मामला है। यह बाइनरी हो सकता है। यह बैश या पायथन या पीएचपी या जो कुछ भी हो सकता है; उन सभी के पास शेल स्क्रिप्ट हैश-बैंग है। यदि आप आँख बंद करके इसके माध्यम से मजबूर करते हैं sh, जो जानता है कि क्या हो सकता है यह शायद त्रुटि-रहित होगा, लेकिन यह गलती से उस दूर होने से पहले हानिकारक कोड चला सकता है।

chmodइसे डिंग करके (निष्पादन की अनुमति बिट को सक्षम करने के लिए) और फिर इसे चलाने पर ./script.run, आप इसे चलाने की सर्वोत्तम संभव संभावना देते हैं। यदि यह एक शेल स्क्रिप्ट है, तो इसके हैश-बैंग को ठीक से पार्स किया जाएगा और यदि यह एक द्विआधारी निष्पादन योग्य है, तो यह केवल मूल रूप से चलेगा।


आह नहीं पता था कि इस उत्तर के लिए धन्यवाद, बस निष्पाद्य की जाँच करें मैं हैश-बैंग चलाता हूं / बिन / श इसलिए मुझे लगता है कि यह ठीक है
user36976

1

दो विधियां अक्सर एक ही कार्य कर सकती हैं लेकिन बहुत अलग हैं।

sh ./scriptshएक तर्क के साथ कमांड चलाता है ./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

1

एक महत्वपूर्ण अंतर यह है कि आपकी हैशबैंग लाइन में पैरामीटर हैं। उदाहरण के लिए, यदि स्क्रिप्ट के साथ शुरू होता है

#!/bin/bash -e

... और आप इसे बाहरी रूप से चलाते हैं shया bash, उस लाइन को एक टिप्पणी के रूप में व्याख्या किया जाएगा और इसे अनदेखा किया जाएगा, इसलिए -eपैरामीटर (असफलता पर बाहर) संसाधित नहीं किया जाएगा। इसलिए, निम्नलिखित स्क्रिप्ट दी गई है:

#!/bin/bash -e
echo Hello
false
echo goodbye

के लिए उत्पादन ./scriptकिया जाएगा सिर्फ "हैलो", लेकिन के लिए उत्पादन sh scriptकिया जाएगा Hello, जिसके बाद goodbye, जो शायद इरादा नहीं था।

यह, वैसे भी, आपको हमेशा एक अलग set -eकथन का उपयोग करना चाहिए (यह वैसे भी एक अच्छा विचार है - अधिक बार नहीं, यदि कोई समस्या मध्य-स्क्रिप्ट है, तो आप इसे अनदेखा नहीं करना चाहेंगे)।


0

नहीं

[sudo] chmod +x ./<scrupt>.runस्क्रिप्ट को निष्पादन योग्य बनाता है ताकि आप इसे चला सकें ./<script>.run
इसके साथ [sudo] sh ./<script>.runआप इसे चला सकते हैं, भले ही यह निष्पादन योग्य न हो।

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