सेट -U उपयोग अपेक्षित रूप से काम नहीं कर रहा है


12

मैं सीख रहा हूं कि कैसे setअपनी स्क्रिप्ट में विभिन्न विकल्पों का कुशलता से उपयोग किया जाए और set -uजो मेरी स्क्रिप्ट से बाहर निकलने के लिए एकदम सही प्रतीत होता है यदि कोई चर ठीक से सेट नहीं होता है (उपयोगकर्ताओं को हटा रहा है)। आदमी पृष्ठ के अनुसार , set -uऔर set -eनिम्नलिखित करता है ...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

मैंने इस कार्यक्षमता का परीक्षण करने के लिए एक परीक्षण स्क्रिप्ट बनाई, लेकिन यह अपेक्षित रूप से काम नहीं करता है। शायद कोई मुझे अपने मुद्दे को बेहतर ढंग से समझा सके और मैं कहाँ गलत व्याख्या कर रहा हूँ? टेस्ट स्क्रिप्ट नीचे है। धन्यवाद।

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

मुझे उम्मीद है कि स्क्रिप्ट 0 और "यह काम करती है" प्रदर्शित होगी , और फिर ${testing2}सेट नहीं होने पर विफल हो जाएगी ।

इसके बजाय मैं दिखाया गया हूँ 0 और "यह काम करता है" , द्वारा पालन 0 और फिर 0 यह प्रकट नहीं करना चाहिए

क्या कोई कुछ ज्ञान प्रदान कर सकता है? धन्यवाद।


1
इसलिए फॉलोअप ... क्या अशक्त स्ट्रिंग को वैरिएबल सेट करने का कोई तरीका अवैध है / कोई त्रुटि है? मैं अनुमान लगा रहा हूं।
ल्यूक डेविस

जवाबों:


10

"मैन बैश" से:

यदि यह मान दिया गया है तो एक पैरामीटर सेट है। अशक्त स्ट्रिंग एक मान्य मान है। एक बार एक चर सेट करने के बाद, यह केवल unset buildin कमांड का उपयोग करके परेशान हो सकता है।

जब आप करते हैं तो testing2=आप चर को अशक्त स्ट्रिंग में सेट कर रहे हैं।

उसे बदलें unset testing2और पुनः प्रयास करें।


set -eके रूप में एक काम 1. की एक निकास कोड को देखने के लिए है कि पिछले आदेश निष्पादित (काम) इस प्रयास करें 0 के एक से बाहर निकलें कोड है, या है कभी नहीं इस मामले में मदद नहीं करता है इस सवाल पढ़ा :

$ false; a=""; echo $?
0

और मेरा यह भी मानना ​​है कि सेट-ई का उपयोग एक समस्या है जो एक समाधान है।

परेशान चर के उपयोग से क्या त्रुटि हो सकती है set -u:

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

उत्पादन होगा:

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

3

testing2=testing2एक रिक्त स्ट्रिंग में चर सेट करता है ; चर वास्तव में सेट है

हालाँकि, यदि आप echo $testing99एक इंटरैक्टिव बैश शेल (बिना सेटिंग errexit, यानी set -e) में भाग लेंगे, तो आपको एक त्रुटि मिलेगी:

bash: testing99: unbound variable

अलग

अभी स्क्रिप्ट का परीक्षण करते समय, मुझे पता चला कि एक इंटरैक्टिव शेल हमेशा एक चर का विस्तार करने का प्रयास करते समय बाहर नहीं निकलता है जो कि सेट नहीं किया गया है जबकि एक गैर-इंटरैक्टिव शेल (शेल स्क्रिप्ट चला रहा है) हमेशा बाहर निकलता है । POSIX मैन पेज के अनुसार set:

-यू शेल मानक त्रुटि के लिए एक संदेश लिखेगा जब यह एक चर का विस्तार करने की कोशिश करता है जो सेट नहीं होता है और तुरंत बाहर निकल जाता है। एक इंटरैक्टिव शेल बाहर नहीं निकलेगा।

एक इंटरैक्टिव बैश खोल से बाहर निकलने नहीं होगा जब तक errexitहै भी सेट किया गया। दूसरी ओर, एक इंटरैक्टिव डैश शेल बाहर नहीं निकलेगा - भले ही set -eपहले चला हो।


यदि डैश सेट-ई के साथ बाहर नहीं निकलता है; सेट-यू; अशांत आ; गूंज $ आ, तो डैश गलत है।
स्किल्ली

@ सामान्य तौर पर जब मैंने पहली बार इस पर ध्यान दिया, तो मुझे लगा कि डैश लेखक मुझसे बेहतर जानते हैं और हो सकता है कि POSIX विशिष्टताओं में कुछ अस्पष्टता रही हो, लेकिन pubs.opengroup.org/onlinepubs/9600119799/utilities/… , I की पुनः जाँच की जा रही है सहमत हूँ कि एक बग की तरह लग रहा है, ठीक है।
एंथोनी गोगेगन

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