`$?` क्या है? क्या यह एक चर है?


23

सवाल बहुत सीधा है। मैं पिछले कमांड के एक्जिट कोड का उपयोग करके प्राप्त कर सकता हूं $?। लेकिन वास्तव में यह क्या है?

मुझे नहीं लगता कि यह एक चर है, क्योंकि आपके पास चर के अलावा कोई विशेष वर्ण नहीं हो सकता है _

foo?foo=10

परिणाम में त्रुटि होगी: foo?foo=10: command not found

तो अगर यह एक चर नहीं है, तो यह क्या है? क्या अन्य लोग भी इसके जैसे हैं?


6
stackoverflow.com/questions/6834487/… यहाँ आप जाएँ :)
RiddleMeThis

जवाबों:


23

यह क्या है?

$? एक अंतर्निहित वैरिएबल है जो कमांड, फ़ंक्शन या स्क्रिप्ट की निकास स्थिति को स्वयं संग्रहीत करता है।

$?निष्पादित अंतिम कमांड की निकास स्थिति को पढ़ता है। एक फ़ंक्शन के बाद, $?फ़ंक्शन में निष्पादित अंतिम कमांड का निकास स्थिति देता है। यह बाश के कार्यों को "वापसी मूल्य" देने का तरीका है। यह 0सफलता पर या 1 - 255त्रुटि पर सीमा में पूर्णांक देता है ।

क्या अन्य लोग भी इसे पसंद करते हैं?

हां, कई ऐसे बिल-इन वैरिएबल हैं जो बैश में हैं। आप यहां एक सूची देख सकते हैं । देखें: http://www.tldp.org/LDP/abs/html/exit-status.html


1
तो यह केवल बैश शेल में उपलब्ध है?
daltonfury42

4
@ daltonfury42 नहीं, किसी भी खोल कि बॉर्न शैल के साथ कुछ संगतता के लिए प्रयास यह समर्थन करेंगे (सहित dash, ksh, zsh, दूसरों के बीच)।
मुरू

2
$statusएक ही उद्देश्य के लिए csh और मछली का उपयोग
ग्लेन जैकमैन

22

$?एक चर है, लेकिन एक विशेष है, इसलिए विशेष वर्णों की अनुमति है। ($?)सबसे हाल ही में निष्पादित अग्रभूमि पाइपलाइन की निकास स्थिति का विस्तार होता है।

यह केवल एक ही नहीं है, शेल कई मापदंडों को विशेष रूप से मानता है। इन मापदंडों को केवल संदर्भित किया जा सकता है; उन्हें असाइनमेंट की अनुमति नहीं है:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

सूत्रों का कहना है:


2
"$*"केवल एक शब्द के रूप में सभी स्थितीय मानदंड नहीं हैं, लेकिन एक ही शब्द के पहले वर्ण द्वारा अलग किए गए सभी स्थितिगत पैरामीटर हैं IFS। चूंकि परिणाम को विभाजित करने के लिए क्षेत्र विभाजन के अधीन किया जाएगा यदि उद्धृत नहीं किया गया है, तो प्रभाव ऐसा है जैसे $@कि अनकोटेड मामले में उपयोग किया जाता है।
मुरू

1
यह सुनिश्चित करने के लिए: $ $ @ और $ * समान हैं क्योंकि वे दोनों शब्द विभाजन के अधीन हैं । उद्धृत किया गया है, "$ @", शब्द को विभाज्य मापदंडों के संरक्षण के लिए संरक्षित करता है, भले ही एक व्यक्तिगत पैरामीटर में IFS में कोई वर्ण हो।
कोजिरो

1
क्या इसका कोई संदर्भ है कि कब गोले के लिए उपयोग किया जाता है? मुझे आश्चर्य है कि अगर पर्ल ने शेल स्क्रिप्टिंग से लिया।
सिंबाके

यह पर्ल को दशकों से (या कम से कम वर्षों) पूर्ववर्ती करता है। Perl सिंटैक्स का बहुत कुछ शेल सिंटैक्स से प्रभावित था। (पर्ल का जन्म 1987 में हुआ था, और इस सिंटैक्स का बहुत हिस्सा मूल बॉर्न शेल (1977) से आया था। मैं $ 100 का नहीं जब $ _ को पेश किया गया था, लेकिन यह 1987 से पहले लगभग निश्चित रूप से अच्छा था।
पॉपअप

6

$?एक विशेष शेल पैरामीटर (चर) है।

सामान्य तौर पर सभी उपयोगकर्ता निर्धारित चरों चरित्र वर्ग से केवल अक्षरों का उपयोग द्वारा नामित किया जाना चाहिए [:alnum:]यानी [a-zA-Z0-9_](भी साथ शुरू नहीं कर सकते [0-9])।

संक्षेप में, $?एक विशेष चर है ( और इनमें से काफी कुछ हैं ) जिसे शेल की आंतरिक विशेषता के रूप में माना जा सकता है जो पिछले कमांड का निकास कोड प्रदान करता है (चाहे वह सफल हो या विफल)।

चरों पर अधिक विचार प्राप्त करने के लिए आप इसे पढ़ सकते हैं


4

$?बैश में एक विशेष चर है जो हमेशा अंतिम निष्पादित कमांड का रिटर्न / निकास कोड रखता है ।

आप इसे टर्मिनल में देख सकते हैं echo $?

रिटर्न कोड सीमा में हैं [0; 255]। आमतौर पर
रिटर्न कोड का 0मतलब है कि सब कुछ ठीक है।
अन्य मान त्रुटियों को इंगित करते हैं। अधिकांश एप्लिकेशन रिटर्न 1या कस्टम मान। यदि कोई आदेश नहीं मिला, तो चर में आमतौर पर होता है127

यदि आप इस चर को एक विशिष्ट मान पर सेट करना चाहते हैं, तो आप bash -c "exit 5"रिटर्न कोड के उदाहरण के लिए वापसी के साथ आसानी से कर सकते हैं 5


शेल फ़ंक्शन एक आवश्यक स्थिति के बिना बाहर निकलने की स्थिति निर्धारित करने के लिए एक POSIX आज्ञाकारी तरीका है। setstatus() { return 5; }
कोजिरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.