-बेश में क्या करता है शेबंग?


32

मेरे पास निम्नलिखित के साथ एक bash स्क्रिप्ट है:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

-ई के बिना यह स्क्रिप्ट नहीं चलेगी। -eइस स्क्रिप्ट के लिए क्या करता है ? इसके अलावा, $?इस संदर्भ में क्या करता है?


1
अजीब। कोई -eआदमी पेज में (मैं वास्तव में एक जवाब पता इस देखना चाहते हैं)। $?अंतिम निकास कोड होता है ( egrepऊपर दी गई प्रक्रिया का)।

2
@st: के -eतहत प्रलेखित है set
ग्रेग हेविल

आप ऐसा करके अपनी पटकथा को सरल बना सकते हैं:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
बोलोवन

2
आप के बीच एक स्थान याद कर रहे हैं ifऔर [। यह स्क्रिप्ट साथ काम नहीं करेगी -e, क्योंकि अगर grepकुछ भी नहीं मिला तो -eस्क्रिप्ट के तहत वहीं समाप्त हो जाएगा। इसके बिना -e, आपको संदेश पीछे की ओर मिला है: $?0 की स्थिति ( ) का अर्थ है कि grep ने उपयोगकर्ता को ढूंढ लिया है। ध्यान दें कि यह `grep '^ उपयोगकर्ता नाम होना चाहिए:' 'वैसे, (यदि नाम के साथ कोई अन्य उपयोगकर्ता है तो क्या होगा?)।
गिल्स एसओ- बुराई को रोकना '

3
क्या लाइन # 1 और ऑन लाइन # 2 #/bin/bash -eके समान प्रभाव होगा ? #/bin/bashset -e
BLong

जवाबों:


34

त्रुटि से बाहर निकलना। अधिक झंडे

यदि कोई त्रुटि है तो वह तुरंत बाहर निकल जाएगी।

द $? पिछले आदेश की निकास स्थिति है। लिनक्स में 0 से बाहर निकलने की स्थिति का मतलब है कि कमांड सफल था। किसी अन्य स्थिति का अर्थ होगा कि कोई त्रुटि हुई है।

egrep "^ उपयोगकर्ता नाम" / etc / passwd> / dev / null / etc / passwd फ़ाइल के तहत उपयोगकर्ता नाम की तलाश करेगा। अगर यह मिल जाए तो बाहर निकलने की स्थिति $? 0. के बराबर होगा। अगर यह नहीं मिलता है तो बाहर निकलने की स्थिति कुछ और होगी (0 नहीं), इसलिए आप "गूंज मौजूद नहीं है"।


इसके अलावा, आप पहली-दो पंक्तियों को बदलकर -ई के बिना स्क्रिप्ट को सही ढंग से काम कर सकते हैं if egrep "^username" /etc/passwd >/dev/null

1
setहालांकि कोई आवश्यकता क्यों नहीं है? : - /

1
@pst: क्योंकि -eकमांड-लाइन तर्क के रूप में बैश करने के लिए दिया जाता है। के तहत सूचीबद्ध सभी विकल्प setभी इसकी कमांड लाइन में बैश द्वारा स्वीकार किए जाते हैं - मैनुअल पेज के अनुभाग विकल्पों में पहला वाक्य नोट करें ।
गोरखधंधा

14

सभी बैश कमांड लाइन स्विच में प्रलेखित हैं man bash

      -एक पाइप लाइन (जिसमें एक हो सकता है) से तुरंत बाहर निकलें
              एकल सरल आदेश), एक उपखंड कमांड में संलग्न है
              कोष्ठक, या आदेशों के एक भाग के रूप में निष्पादित
              एक कमांड सूची ब्रेसिज़ द्वारा संलग्न (शेल GRAMMAR देखें)
              ऊपर) एक गैर-शून्य स्थिति के साथ बाहर निकलता है। खोल नहीं है
              यदि आदेश विफल रहता है तो बाहर निकलें कमांड का हिस्सा है
              थोड़ी देर बाद या कीवर्ड तक तुरंत सूची दें,
              यदि या एलिफ आरक्षित निम्नलिखित परीक्षण का हिस्सा है
              शब्द, a && या में निष्पादित किसी भी कमांड का हिस्सा || सूची
              अंतिम और& या || के बाद कमांड को छोड़कर, कोई भी
              कमांड एक पाइपलाइन में लेकिन अंतिम, या यदि कमांड है
              वापसी मूल्य के साथ उलटा किया जा रहा है! ईआरआर पर एक जाल,
              यदि सेट किया जाता है, तो शेल बाहर निकलने से पहले निष्पादित किया जाता है। इस विकल्प
              शेल पर्यावरण पर लागू होता है और प्रत्येक उपधारा एनवी-
              अलग से रॉनमेंट (देखें कमोडिटी एक्विपमेंट)
              ऊपर), और निष्पादित करने से पहले सबशेल से बाहर निकलने का कारण हो सकता है
              सबशेल में सभी कमांड।

2
आह। मैंने इसे आदमी में खोजा, लेकिन फाइल परीक्षणों में -e खोजने के बाद और मुख्य तर्क के तहत नो-ई ने मुझे छोड़ दिया। अच्छा अंश। setहालांकि कोई आवश्यकता क्यों नहीं है? : - /

1

आपकी स्क्रिप्ट गलत है, क्योंकि

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

बाहर निकलने की स्थिति 0 - माध्य - सब कुछ ठीक है, grep के मामले में "ठीक है, स्ट्रिंग पाया"। बाहर निकलने की स्थिति! = 0 का मतलब कुछ गलत है, grep के मामले में 1 का मतलब है, "नहीं मिला", 2 का मतलब "मैं इनपुट नहीं कर सकता ..."

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