कैसे बाहर निकलें कोड पर कब्जा करने के लिए `स्थानीय` बनाने के लिए?


11

मेरी परियोजना में मेरे पास निम्नलिखित स्निपेट हैं:

local output="$(bash "${1##*/}")"
echo "$?"

यह हमेशा शून्य को प्रिंट करता है local, हालांकि, हटाने localसे $?चर सही तरीके से व्यवहार करने का कारण बनता है: जो कि उपधारा से निकास कोड को ग्रहण करना है।

मेरा सवाल है: मैं कैसे इस चर स्थानीय रखने के लिए भी बाहर निकलने के मूल्य पर कब्जा कर सकते हैं?


1
shellcheckन केवल इस मुद्दे को पकड़ लेगा बल्कि unix.stackexchange.com/a/281749/24718 पर समाधान सुझाएगा !
वलीद खान

जवाबों:


16
#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

यह गूंज जाएगा 127, "कमांड नहीं मिला" के लिए सही त्रुटि कोड।

आप localएक से अधिक वेरिएबल को परिभाषित करने के लिए उपयोग कर सकते हैं । इसलिए मैं अभी भी सफल RETहोने से पहले उपसमूह के निकास कोड को पकड़ने localऔर $?शून्य पर सेट करने के लिए स्थानीय चर बनाता हूं ।


क्या यह गारंटी है कि bashइस अभिव्यक्ति को दाएं से बाएं का मूल्यांकन करता है?
मैक्स राइड

जहां तक ​​मुझे जानकारी है, चर असाइनमेंट क्रम में हैं, इस संदर्भ में दाएं से बाएं, हां।
डोपघोटी

@MaxRied तथ्य यह है कि मज़बूती से काम करता है यह इंगित करने के लिए प्रकट होता है कि हाँ, यह है। हालाँकि, मुझे इसके बारे में न तो POSIX से और न ही bashसंदर्भ पुस्तिका से कोई जानकारी मिल सकती है ।
बिल्ली

10
एक तरफ के रूप में, ऑल-कैप्स चर नामों का उपयोग करना खराब रूप है। POSIX पर्यावरण चर कल्पना को pubs.opengroup.org/onlinepubs/009695399/basedefs/… पर देखें , जो शेल या सिस्टम के अर्थ वाले चर के लिए आरक्षित सभी ऊपरी-ऊपरी नामों का वर्णन करता है और कम से कम एक निम्न-वर्ण वाले वर्णों के नाम अनुप्रयोग-परिभाषित उपयोग के लिए आरक्षित है, यह ध्यान में रखते हुए कि शेल चर और पर्यावरण चर एक नाम स्थान साझा करते हैं (चूंकि, टकराव की स्थिति में, पूर्व को असाइन करना बाद में ओवरराइड कर सकता है)।
चार्ल्स डफी

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
terdon

27

इससे पहले कि आप इसे असाइन करें, स्थानीय चर घोषित करें:

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

मेरी राय में यह एक अतिरिक्त RETचर सेट करने की तुलना में अधिक पठनीय है । उस पर YMMV, लेकिन यह आपकी अपेक्षा के अनुरूप ही काम करता है।


2
यह एक अलग चर का उपयोग करने की तुलना में बहुत बेहतर है, जैसा कि स्पष्ट होना चाहिए यदि आप कई असाइनमेंट के रिटर्न कोड की जांच करना चाहते हैं: बस local var1 var2 ...और बॉब के चाचा।
l0b0

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