यूनिक्स कंसोल या मैक टर्मिनल पर शेल स्क्रिप्ट कैसे चलाएं?


506

मैं इसे जानता हूं, इसे भूल जाओ और इसे फिर से जारी करो। इसे लिखने का समय।


15
प्रतिष्ठा स्टेशन के लिए सभी रास्ते upvote ट्रेन लेखन
DivideByZer0

बस उस भयानक त्रुटि की प्रशंसा करने के लिए अपवोट न करें जो आपको वहां मिला है!
BRHSM

जवाबों:


941

एक गैर-निष्पादन योग्य shस्क्रिप्ट चलाने के लिए , उपयोग करें:

sh myscript

एक गैर-निष्पादन योग्य bashस्क्रिप्ट चलाने के लिए , उपयोग करें:

bash myscript

एक निष्पादन योग्य शुरू करने के लिए (जो निष्पादन योग्य अनुमति के साथ कोई फ़ाइल है); आप इसे इसके मार्ग से निर्दिष्ट करें:

/foo/bar
/bin/bar
./bar

स्क्रिप्ट को निष्पादन योग्य बनाने के लिए, उसे आवश्यक अनुमति दें:

chmod +x bar
./bar

जब कोई फ़ाइल निष्पादन योग्य होती है, तो कर्नेल यह पता लगाने के लिए ज़िम्मेदार होता है कि इसे कैसे एक्सपेक्ट किया जाए। गैर-बायनेरिज़ के लिए, यह फ़ाइल की पहली पंक्ति को देखकर किया जाता है। इसमें एक होना चाहिए hashbang:

#! /usr/bin/env bash

हैशबैंग कर्नेल को बताता है कि किस प्रोग्राम को चलाना है (इस मामले में कमांड /usr/bin/envको तर्क के साथ चलाया जाता है bash)। फिर, स्क्रिप्ट को प्रोग्राम में पास किया जाता है (दूसरे तर्क के रूप में) सभी तर्कों के साथ आपने स्क्रिप्ट को बाद के तर्कों के रूप में दिया।

इसका मतलब है कि हर स्क्रिप्ट जो निष्पादन योग्य है, उसमें एक हैशबैंग होना चाहिए । यदि ऐसा नहीं होता है, तो आप कर्नेल को यह नहीं बता रहे हैं कि यह क्या है , और इसलिए कर्नेल को यह पता नहीं है कि इसे व्याख्या करने के लिए किस प्रोग्राम का उपयोग करना है। यह हो सकता है bash, perl, python, sh, या कुछ और। (वास्तव में, कर्नेल अक्सर उपयोगकर्ता के डिफ़ॉल्ट शेल का उपयोग फ़ाइल की व्याख्या करने के लिए करेगा, जो बहुत खतरनाक है क्योंकि यह बिल्कुल सही दुभाषिया नहीं हो सकता है या यह इसके कुछ पार्स करने में सक्षम हो सकता है लेकिन सूक्ष्म व्यवहार अंतर जैसे shऔर bash) के बीच का मामला ।

पर ध्यान दें /usr/bin/env

आमतौर पर, आप हैश बैंग्स को ऐसे देखेंगे:

#!/bin/bash

नतीजा यह है कि कर्नेल /bin/bashस्क्रिप्ट की व्याख्या करने के लिए कार्यक्रम चलाएगा । दुर्भाग्य से, bashहमेशा डिफ़ॉल्ट रूप से शिप नहीं किया जाता है, और यह हमेशा उपलब्ध नहीं होता है /bin। लिनक्स मशीनों पर यह आम तौर पर होता है, अन्य POSIX मशीनों की एक श्रृंखला होती है, जहां bashविभिन्न स्थानों में जहाज होते हैं, जैसे कि /usr/xpg/bin/bashया/usr/local/bin/bash

पोर्टेबल बैश स्क्रिप्ट लिखने के लिए, हम इसलिए bashप्रोग्राम के स्थान को हार्ड-कोडिंग पर भरोसा नहीं कर सकते हैं । POSIX में पहले से ही उस से निपटने के लिए एक तंत्र है PATH:। विचार यह है कि आप अपने कार्यक्रमों को उन निर्देशिकाओं में से एक में स्थापित करते हैं जो अंदर हैंPATH और सिस्टम को आपके कार्यक्रम को खोजने में सक्षम होना चाहिए जब आप इसे नाम से चलाना चाहते हैं।

अफसोस की बात है, आप ऐसा नहीं कर सकते :

#!bash

कर्नेल आपके लिए कुछ PATHखोज नहीं करेगा । एक कार्यक्रम है जो आपके लिए एक PATHखोज कर सकता है , हालांकि, इसे कहा जाता है env। सौभाग्य से, लगभग सभी प्रणालियों में एक envकार्यक्रम स्थापित किया गया है /usr/bin। तो हम envएक हार्डकोड मार्ग का उपयोग करना शुरू करते हैं, जो तब PATHखोज करता है bashऔर इसे चलाता है ताकि यह आपकी स्क्रिप्ट की व्याख्या कर सके:

#!/usr/bin/env bash

इस दृष्टिकोण में एक नकारात्मक पहलू है: POSIX के अनुसार, हैशबैंग में एक तर्क हो सकता है । इस मामले में, हम प्रोग्राम bashके तर्क के रूप में उपयोग करते हैं env। इसका मतलब है कि हमारे पास तर्कों को पारित करने के लिए कोई जगह नहीं बची है bash। इसलिए #!/bin/bash -exuइस योजना में कुछ बदलने का कोई तरीका नहीं है । आपको set -exuइसके बजाय हैशबैंग के बाद रखना होगा।

इस दृष्टिकोण का एक और फायदा भी है: कुछ सिस्टम के साथ जहाज हो सकता है /bin/bash, लेकिन उपयोगकर्ता को यह पसंद नहीं आ सकता है, यह बगिया या पुराना लग सकता है, और हो सकता है कि उसने अपना खुद का स्थापित किया bashहो। यह अक्सर ओएस एक्स (मैक) पर होता है, जहां ऐप्पल एक पुराना जहाज बनाता है /bin/bashऔर उपयोगकर्ता /usr/local/bin/bashहोमब्रे जैसे कुछ का उपयोग करके अप-टू-डेट स्थापित करते हैं। जब आप उस envदृष्टिकोण का उपयोग करते हैं जो एक PATHखोज करता है , तो आप उपयोगकर्ता की प्राथमिकता को ध्यान में रखते हैं और उसके द्वारा भेजे गए सिस्टम पर पसंदीदा बैश का उपयोग करते हैं।


66
एक सरल प्रश्न का एक अच्छा उत्तर लिखने के लिए समय निकालने के लिए धन्यवाद।
PA

5
यदि मैं zshअपने शेल के रूप में उपयोग करता हूं, तो क्या मैं उपयोग करूंगा hashbang #! /usr/bin/env zsh?
स्टेफमिकेल

6
@stefmikhail: यह कोई फर्क नहीं पड़ता कि स्क्रिप्ट को लागू करने के लिए आप किस शेल इंटरप्रेटर का उपयोग करते हैं , आपको इसका उपयोग करना चाहिए #! /usr/bin/env zshयदि (और केवल यदि) स्क्रिप्ट के अंदर कोड Z शेल द्वारा निष्पादित किया जाना चाहिए।
Johnsyweb

1
स्पष्टीकरण के लिए +1। मैं भूल जाता हूं, लेकिन कमांड का अर्थ जानने के बाद मुझे याद करने में मदद मिलेगी।
एंजेलिन नादर

2
@Carpetsmoker यह सही है, और हैशबैंग तक सीमित नहीं है। बैश लिपियों को हमेशा यूनिक्स लाइन एंडिंग्स का उपयोग करना चाहिए अन्यथा हर कमांड के अंतिम तर्क के पास इसे जोड़ा जाएगा, जैसे हैशबैंग कमांड नाम होगा।
लुननाथ

80

शेल-स्क्रिप्ट 'file.sh' शुरू करने के लिए:

sh file.sh

bash file.sh

एक अन्य विकल्प chmod कमांड का उपयोग करके निष्पादन योग्य अनुमति निर्धारित है:

chmod +x file.sh

अब .sh फ़ाइल को निम्नानुसार चलाएँ:

./file.sh

15

बोर्न शेल के लिए:

sh myscript.sh

बैश के लिए:

bash myscript.sh

इस स्पष्ट प्रश्न का उत्तर देने के लिए धन्यवाद। मेरे जैसे मैक लड़के के लिए लैप्स के बीच पुराने यूनिक्स कमांड को भूलना आसान है।
PA

10

यदि आप स्क्रिप्ट को वर्तमान शेल में चलाना चाहते हैं (जैसे आप चाहते हैं कि यह आपकी निर्देशिका या वातावरण को प्रभावित करने में सक्षम हो) तो आपको कहना चाहिए:

. /path/to/script.sh

या

source /path/to/script.sh

/path/to/script.shउदाहरण के लिए, वर्तमान निर्देशिका के तहत निर्देशिका में . bin/script.shचलने वाले नोट नोट कर सकते हैं ।script.shbin


7
Be बहुत सावधान जब सोर्सिंग या relateive pathnames साथ dot'ing। आपको हमेशा उनके साथ शुरू करना चाहिए । यदि आप ऐसा नहीं करते हैं, और संबंधित पथनाम में कोई स्लैश नहीं है, तो आप मौजूदा निर्देशिका में कुछ पाथ में कुछ सोर्सिंग करेंगे! दुरुपयोग के लिए बहुत खतरनाक है।
लहुनाथ

0

सबसे पहले, निष्पादन की अनुमति दें: -
chmod +x script_name

  1. यदि स्क्रिप्ट निष्पादन योग्य नहीं है: -
    श स्क्रिप्ट स्क्रिप्ट
    sh script_name
    चलाने के लिए : - बैश स्क्रिप्ट फ़ाइल चलाने के लिए: -
    bash script_name
  2. यदि स्क्रिप्ट निष्पादन योग्य है: -
    ./script_name

नोट : -आप जाँच कर सकते हैं कि क्या फ़ाइल निष्पादन योग्य है या नहीं 'ls -a' का उपयोग करके


0

फ़ाइल एक्सटेंशन .command Terminal.app को सौंपा गया है। किसी भी .command फ़ाइल पर डबल-क्लिक करना उसे निष्पादित करेगा।


0

थोड़ा सा, उसी फ़ोल्डर से एक दुभाषिया चलाने के लिए, अभी भी स्क्रिप्ट में #! हैशबैंग का उपयोग करना।

उदाहरण के लिए / phr7.2 निष्पादन योग्य / usr / bin से कॉपी किया गया जो एक फ़ोल्डर में एक हैलो स्क्रिप्ट के साथ है।

#!./php7.2
<?php

echo "Hello!"; 

इसे चलाने के लिए:

./hello

जो समान व्यवहार करता है:

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