डमी के लिए बैश शेबग?


36

मेरे पास कुछ बैश स्क्रिप्ट हैं, मेरे पास सेटअप है जो ज्यादातर उपयोग करते हैं

#!/bin/bash

लेकिन मुझे नियमित रूप से कुछ ऐसे दिखते हैं जो पसंद आते हैं

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

और इसी तरह।

क्या कोई इन शेबंग विकल्पों का अर्थ और लाभ बता सकता है और क्या वे अन्य शेबंग पर लागू होते हैं?


वे विकल्प बैश (या अन्य दुभाषिया) के लिए विशिष्ट हैं। वे अन्य गोले (डैश और ksh, उदाहरण के लिए) के लिए समान हो सकते हैं, लेकिन वे AWK और पायथन जैसे अन्य दुभाषियों के लिए अलग होंगे। आप कई विकल्पों का उपयोग कर सकते हैं जो दुभाषिया स्वीकार करता है। विकल्प इंटरप्रेटर-विशिष्ट होते हैं जबकि शेबंग एक कर्नेल विशेषता है।
अगली सूचना तक रोक दिया गया।

जवाबों:


41

यदि एक स्क्रिप्ट के /path/to/fooसाथ शुरू होता है #!/bin/bash, तो निष्पादन निष्पादन /path/to/foo arg1 arg2के बराबर है /bin/bash /path/too/foo arg1 arg2। यदि शबंग रेखा है #!/bin/bash -ex, तो यह निष्पादन के बराबर है /bin/bash -ex /path/too/foo arg1 arg2। यह सुविधा कर्नेल द्वारा प्रबंधित की जाती है।

ध्यान दें कि आप portably कुटिया लाइन पर सिर्फ एक ही तर्क हो सकता है: (जैसे लिनक्स) कुछ unices केवल एक ही तर्क स्वीकार करते हैं, तो यह है कि #!/bin/bash -e -xएक पांच-चरित्र तर्क प्राप्त बैश के लिए नेतृत्व करेंगे -e -xदो तर्क (में सिंटेक्स त्रुटि) के बजाय -eऔर -x

shबॉश शेल और व्युत्पन्न गोले जैसे कि पोसिक्स श, बैश, क्ष, और ज़श के लिए:

  • -e इसका मतलब यह है कि यदि कोई कमांड विफल हो जाती है (जो एक गैर-स्थिति को वापस करके इंगित करता है), तो स्क्रिप्ट तुरंत समाप्त हो जाएगी।
  • -x शेल एक निष्पादन ट्रेस को मुद्रित करने का कारण बनता है।

अन्य कार्यक्रम इन विकल्पों को समझ सकते हैं लेकिन विभिन्न अर्थों के साथ।


24

वे इस मामले में अधिक जानकारी के लिए bashदेखे गए विकल्प हैं help set:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

3
+1 और -exदोनों करते हैं
निफ़ल

यह भ्रामक है क्योंकि वे बैश में पारित कमांड लाइन विकल्पों की तरह दिखते हैं।
काओल्टे

2
@ कैओलेट: और वास्तव में वे (से man bash) हैं In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]:।
cYrus

1
अरे! पलक और आप इसे याद आती है! :)।
कावलेटी

0

मैं एक और भी बेहतर उल्लेख करना चाहूंगा - जैसे कि अधिक पोर्टेबल - वैकल्पिक:

#!/usr/bin/env bash

ऊपर दिए गए उदाहरण निष्पादन योग्य envको खोजने के लिए उपयोग करते हैं bash, जो हमेशा नहीं होता है /bin/bash। उदाहरण के लिए ये पुरानी #!/bin/bashस्क्रिप्ट निक्स पर काम नहीं करती है ।

आप का उपयोग करते हैं env, जैसा कि ऊपर का प्रदर्शन किया है, तो आप इस तरह के रूप एक तर्क की आपूर्ति नहीं कर सकते -eकरने के लिए bash(के रूप में तक मुझे पता है)। लेकिन आप इसके बजाय ऐसा कर सकते हैं:

#!/usr/bin/env bash
set -e

2
मैं यह हर समय करता हूं, लेकिन मैं यह नहीं कहूंगा कि यह "अधिक पोर्टेबल" है - वास्तव में, उपयोगकर्ता के पास कुछ पूरी तरह से अलग चलाने का जोखिम (आप जो सिस्टम जहाजों के साथ ग्रहण कर सकते हैं) बहुत अधिक है। उदाहरण के लिए, उबंटू अभी भी बैश 4 को जहाज करता है, जबकि एक उपयोगकर्ता बैश 5 को चलाने के लिए चुन सकता है
slhck

हाँ envउपयोग विशेष रूप से स्क्रिप्ट के लिए अच्छा नहीं है जो अजगर को चलाते हैं क्योंकि आप बस यह नहीं जानते हैं कि क्या डिफ़ॉल्ट pythonसंस्करण 2 या 3 है और यह स्क्रिप्ट के लिए अंतर की दुनिया बनाता है जिसे एक विशिष्ट संस्करण की आवश्यकता होती है। चालाक से बेहतर होने के लिए बेहतर है
smac89
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.