जवाबों:
एक गैर-निष्पादन योग्य 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
खोज करता है , तो आप उपयोगकर्ता की प्राथमिकता को ध्यान में रखते हैं और उसके द्वारा भेजे गए सिस्टम पर पसंदीदा बैश का उपयोग करते हैं।
zsh
अपने शेल के रूप में उपयोग करता हूं, तो क्या मैं उपयोग करूंगा hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
यदि (और केवल यदि) स्क्रिप्ट के अंदर कोड Z शेल द्वारा निष्पादित किया जाना चाहिए।
बोर्न शेल के लिए:
sh myscript.sh
बैश के लिए:
bash myscript.sh
यदि आप स्क्रिप्ट को वर्तमान शेल में चलाना चाहते हैं (जैसे आप चाहते हैं कि यह आपकी निर्देशिका या वातावरण को प्रभावित करने में सक्षम हो) तो आपको कहना चाहिए:
. /path/to/script.sh
या
source /path/to/script.sh
/path/to/script.sh
उदाहरण के लिए, वर्तमान निर्देशिका के तहत निर्देशिका में . bin/script.sh
चलने वाले नोट नोट कर सकते हैं ।script.sh
bin
सबसे पहले, निष्पादन की अनुमति दें: -
chmod +x script_name
sh script_name
bash script_name
./script_name
नोट : -आप जाँच कर सकते हैं कि क्या फ़ाइल निष्पादन योग्य है या नहीं 'ls -a' का उपयोग करके
थोड़ा सा, उसी फ़ोल्डर से एक दुभाषिया चलाने के लिए, अभी भी स्क्रिप्ट में #! हैशबैंग का उपयोग करना।
उदाहरण के लिए / phr7.2 निष्पादन योग्य / usr / bin से कॉपी किया गया जो एक फ़ोल्डर में एक हैलो स्क्रिप्ट के साथ है।
#!./php7.2
<?php
echo "Hello!";
इसे चलाने के लिए:
./hello
जो समान व्यवहार करता है:
./php7.2 hello