#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
खाली मूल्य छापता है। मैंने उम्मीद की:
1
t1
वेरिएबल को एग्जिट कमांड का रिटर्न वैल्यू क्यों नहीं दिया जाता है - 1
?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
खाली मूल्य छापता है। मैंने उम्मीद की:
1
t1
वेरिएबल को एग्जिट कमांड का रिटर्न वैल्यू क्यों नहीं दिया जाता है - 1
?
जवाबों:
local t1=$(exit 1)
शेल को बताता है:
exit 1
एक उपधारा में चला ;t1
, फ़ंक्शन के लिए स्थानीय।यह इस प्रकार सामान्य है कि t1
समाप्त होने से खाली है।
( कमांड प्रतिस्थापन के$()
रूप में जाना जाता है ।)
निकास कोड हमेशा सौंपा गया है $?
, इसलिए आप कर सकते हैं
function0()
{
(exit 1)
echo "$?"
}
वह प्रभाव प्राप्त करने के लिए जिसे आप खोज रहे हैं। आप निश्चित रूप $?
से दूसरे चर को असाइन कर सकते हैं :
function0()
{
(exit 1)
local t1=$?
echo "$t1"
}
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
बाहर निकलें कोड $ में संग्रहीत किया गया था ? चर। कमांड प्रतिस्थापन का उपयोग करके केवल आउटपुट कैप्चर करें, आपको सबस्क्राइब बनाने के लिए (...) का उपयोग करना चाहिए :
#!/bin/bash
func() {
(exit 1)
local t1=$?
printf '%d\n' "$t1"
}
func
t1=$?
का बिंदु इसका उपयोग करना है, नहीं? और $?
असाइनमेंट सेशन से क्लोब नहीं मिलेगा? मुझे लगता है मैं पूछ रहा हूँ कि यह नहीं होना चाहिएprintf '%d\n' "${t1}"
में bash
इस काम करता है:
loc(){ local "x=$(exit "$1"):$?"
printf '$%s:\t%d\n' \
x "${x##*:}" \? "$?"
}
यह आदेश मूल्यांकन और चर असाइनमेंट के आदेश के साथ करना है। local
एक वापसी मूल्य अपने सभी - और यह वर्तमान में निष्पादित कमांड है, न कि कमांड प्रतिस्थापन। कारण जैसी बातें ...
x=$(exit 1); echo "$?"
... 1 वापस आ सकता है क्योंकि उस कमांड में कभी भी कोई रिटर्न नहीं होता है सिवाय इसके कि सबस्क्रिप्शन चलाने के लिए सब- $x
वेल्यू असाइन की जाए - इसलिए $?
क्लोबबर्ड नहीं मिलता है क्योंकि यह व्यावहारिक रूप से हर दूसरे मामले में होता है जिसमें कमांड सब्स्टीट्यूशन का उपयोग किया जाता है।
वैसे भी, के साथ local
यह है clobbered कर - जब विस्तार अभी भी मूल्यांकन किया जा रहा है कर रहे हैं और जो - लेकिन आप सही समय पर इसे पकड़ अगर पहले local
आप अभी भी इसे प्रदान कर सकते हैं - के दिनचर्या यह पीटना करने के लिए एक मौका है।
unset x; loc 130; echo "${x-\$x is unset}"
... प्रिंट ...
$x: 130
$?: 0
$x is unset
हालांकि आपको पता होना चाहिए कि कई गोले में आप $?
उस तरह से मध्य-मूल्यांकन निर्धारित करने पर भरोसा नहीं कर सकते । वास्तव में, ऐसा शायद इसलिए है क्योंकि वे गोले हर संभव समय पर पुनर्मूल्यांकन करने की जहमत नहीं उठाते हैं जैसा कि शायद bash
- जो मैं तर्क करता हूं वह शायद बेहतर व्यवहार है bash
। क्या आप वास्तव में अपने दुभाषिया पुनरावर्ती लूप-मूल्यांकन मूल्यों को चाहते हैं जो आपके द्वारा उपयोग करने का मौका होने से पहले बहुत हद तक अधिलेखित होने की संभावना है?
वैसे भी, आप ऐसा कर सकते हैं।
इस बात पर निर्भर करता है कि आप केवल बाहर निकलने का कोड प्राप्त करने का प्रयास क्यों कर रहे हैं, आप बस चला सकते हैं if some-command; then echo "Success $?"; else echo "Failure $?"; fi
जो कमांड के आउटपुट के साथ कुछ भी नहीं करता है, यह सिर्फ कमांड रन के निकास कोड का मूल्यांकन करता है। आप जोड़ सकते हैं or
( or
$ ( around the command and you'll still get the same results. A better example might be
अगर grep -q 'somestring' somefile; तो गूंज "सोमेस्ट्रिंग एग्जिट कोड $ है?);" "सोमेस्ट्रिंग एग्जिट कोड नहीं मिला?"; फाई `।
आप किसी फ़ंक्शन के रिटर्न कोड का भी परीक्षण कर सकते हैं जो या तो एक स्पष्ट return 3
या एक निहित रिटर्न कोड हो सकता है, जो अंतिम कमांड का परिणाम है, इस मामले में आपको सावधान रहने की आवश्यकता है कि आपके पास echo
अंत में नहीं है फ़ंक्शन, अन्यथा यह पिछले निकास कोड को मास्क / रीसेट करता है।
command_last () {
echo "True is `true`"
echo "False is `false`"
false
}
command_last; echo $?
# Outputs:
# True is 0
# False is 1
# 1
echo_last () {
echo "True is `true`"
echo "False is `false`"
false
# echo'ing literally anything (or nothing) returns true aka exit 0
echo
}
echo_last; echo $?
# Outputs:
# True is 0
# False is 1
# # Blank line due to empty echo
# 0
अंत में एक गंदा चाल क्योंकि आप नहीं कर सकते VAR=(SOME_COMMAND)
क्योंकि VAR=()
एक सरणी परिभाषा है, इसलिए आपको इसकी आवश्यकता है VAR=( $(echo 'Some value') )
।