बैश स्क्रिप्टिंग - 'टाइप' रिटर्न वैल्यू अलग इनिट स्क्रिप्ट


1

क्या कोई मुझसे इसकी व्याख्या करेगा:

$ type blah
bash: type: blah: not found
$ echo $?
1

$ bash --init-file <( echo "type blah; echo $?" )
bash: type: blah: not found
0

इंटरएक्टिव शेल में रिटर्न इनिट स्क्रिप्ट से अलग क्यों है?

एक इंटरैक्टिव शेल के लिए init स्क्रिप्ट में संपादित करें और फिर से अलग:

$ bash --init-file <( echo "type blah; echo $?" ) -i
bash: type: blah: not found
2

बैश संस्करण 4.4.12 है।

जवाबों:


1

समस्या यह है कि बाहरी कमांड के तर्क के रूप में पारित $?होने से पहले इसका मूल्यांकन किया जा रहा है echo। परिणामस्वरूप, आप इसके बराबर चल रहे हैं:

bash --init-file <( echo "type blah; echo 0" ) -i

आप इसे इस set -xमोड का उपयोग करके देख सकते हैं जो निष्पादित कमांड के बराबर दिखाई देगा:

$ bash --init-file <( echo "type blah; echo $?" )
+ bash --init-file /dev/fd/63
++ echo 'type blah; echo 0'
bash: type: blah: not found
0

तीसरी पंक्ति पर ध्यान दें, ++ echo 'type blah; echo 0'- कमांड में $?पारित होने से पहले ही इसका विस्तार किया गया है echo(और निष्पादित करने के लिए नए शेल में थ्रेस)। BTW, इसका मतलब है कि यह वास्तव में इस से पहले चलाए गए अंतिम कमांड का परिणाम दिखा रहा है :

$ curl http://notarealdomain.example.com/
curl: (6) Could not resolve host: notarealdomain.example.com
$ bash --init-file <( echo "type blah; echo $?" )
bash: type: blah: not found
6

ध्यान दें कि मुद्रित स्थिति, "6" curlएक अनार्य होस्ट त्रुटि के लिए कोड है।

वैसे भी, समाधान सरल है: मूल्यांकन के विलंब के लिए एकल-उद्धरण का उपयोग करें $?:

$ bash --init-file <( echo 'type blah; echo $?' )
bash: type: blah: not found
1

ओह, एफएफएस, एक बेवकूफ सवाल के लिए खेद है!
टॉम

1

पहले जवाब दो

  1. इनिट-स्क्रिप्ट का रिटर्न वैल्यू से कोई लेना-देना नहीं है।
  2. प्रक्रिया प्रतिस्थापन <(...)वास्तविक कारण है।

व्याख्या

[प्रमाण १] अब इस कमांड को नीचे देखें। इसका कोई विकल्प नहीं है --init-file, लेकिन समान आउटपुट (कुछ तुच्छ प्रिंट के साथ)।

(exit 10)
bash <( echo "type blah; echo $?" )

[प्रूफ २] आदेशों का पालन करने की कोशिश करें, और पहले एक में संख्या बदलें, आपको अधिक भिन्न रिटर्न मान मिलेगा।

(exit 117)
bash --init-file <( echo "type blah; echo $?" )

[सबूत 3] आप क्या आउटपुट देखते हैं?

(exit 23)
cat <( echo "type blah; echo $?" )

मुझे लगता है कि आप उपरोक्त 3 प्रमाणों के माध्यम से उत्तर 1 को समझ सकते हैं। Answer2 के बारे में क्या?

यदि आप echo "type blah; echo $?"इसे चलाने के लिए केवल साधारण कमांड टाइप करते हैं , तो आप किस परिणाम की उम्मीद करते हैं? आपको उम्मीद है कि यह प्रिंट होगा type blah; echo <num>, जिसमें <num>से अंतिम कमांड का रिटर्न मूल्य है। सही? हम सभी जानते हैं कि $?नंबर के साथ प्रतिस्थापित किया जाएगा, क्योंकि हम सभी जानते हैं कि बैश पर पैरामीटर विस्तार होगा $?

यह प्रक्रिया प्रतिस्थापन में समान है <(...)

बैश में, जो आदेश एक प्रक्रिया प्रतिस्थापन में दिखाई देते हैं, <(...)उन्हें सब-सब्स्क्राइब में आमंत्रित किया जाएगा। सब्सक्रिप्शन भी एक शेल (बाश) है। तो कमांड के लिए echo "type blah; echo $?", आपको सबस्क्रिप्शन में ठीक वैसा ही परिणाम मिलेगा जैसा कि आप इसे सीधे शेल में सीधा चलाने के लिए करते हैं, जिसका अर्थ है कि सबस्लेम भी पैरामीटर विस्तार का प्रदर्शन करेगा $?, ठीक उसी तरह जैसे बैश करता है।

इसलिए जब आप चल रहे होते हैं bash --init-file <(echo "type blah; echo $?"), तो init-script फ़ाइल की सामग्री वास्तव में type blah; echo <num>बजाय होती है type blah; echo $?

और गहरा

यद्यपि प्रक्रिया प्रतिस्थापन <(echo "type blah; echo $?")में $?उपधारा द्वारा विस्तार किया जाता है, इसका मूल्य वर्तमान शेल से प्रभावित होता है। ?उप- प्रकार का मान वर्तमान शेल के समान है।

प्रूफ 2 देखें, पहला कमांड है (exit 117), जो $?वर्तमान शेल के मूल्य को 117 बनाता है। लेकिन यह उपधारा में भी 117 तक विस्तारित है।

ऐसा इसलिए है क्योंकि प्रक्रिया प्रतिस्थापन में प्रदर्शित होने वाले आदेशों <(...)को एक उप-वातावरण में लागू किया जाता है जो वर्तमान शेल वातावरण का एक डुप्लिकेट है।

तो यह आपके प्रश्न में स्पष्ट करता है कि यदि आपने -iकमांड में विकल्प रखा है तो आपने अलग-अलग रिटर्न वैल्यू दिखाई है । वह विकल्प द्वारा लाया गया अंतर नहीं है -i। ऐसा इसलिए है क्योंकि उस आदेश से पहले, आप निश्चित रूप से एक और कमांड निष्पादित करते हैं जो 2 देता है।

ओर शब्द

वास्तव में, तीन अन्य रूप हैं जो बैश में प्रक्रिया प्रतिस्थापन के समान काम करते हैं।

  1. कमान प्रतिस्थापन $(...)या`...`
  2. कोष्ठक के साथ समूहीकृत (...)
  3. पाइप लाइन में अंतर्निहित आदेशों <builtin cmd> | ...या ... | <builtin cmd>या<builtin cmd> | <builtin cmd>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.