कैसे जांचें कि कोई कमांड सफल हुआ या नहीं?

क्या यह जांचने का कोई तरीका है कि कमांड निष्पादित करने में कोई त्रुटि है या नहीं?

उदाहरण :

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`valid $test1function valid () {  if $test -eq 1; then    echo "OK"    else echo "ERROR"   fi}

मैंने पहले ही ऐसा करने की कोशिश की लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है । मैं ऐसा कैसे नहीं करता ।

वापसी मूल्य में संग्रहीत है $?. 0 सफलता को इंगित करता है, अन्य त्रुटि को इंगित करता है ।

some_commandif [ $? -eq 0 ]; then    echo OKelse    echo FAILfi

किसी भी अन्य पाठ्य मूल्य की तरह, आप इसे भविष्य की तुलना के लिए एक चर में संग्रहीत कर सकते हैं:

some_commandretval=$?do_something $retvalif [ $retval -ne 0 ]; then    echo "Return code was not zero but $retval"fi

संभावित तुलना ऑपरेटरों के लिए, देखें man test.

यदि आपको केवल यह जानना है कि कमांड सफल हुआ या विफल हुआ, तो परीक्षण को परेशान न करें $?, बस सीधे कमांड का परीक्षण करें । जैसे । :

if some_command; then    printf 'some_command succeeded\n'else    printf 'some_command failed\n'fi

और आउटपुट को एक चर में असाइन करने से रिटर्न वैल्यू में बदलाव नहीं होता है (ठीक है, जब तक कि यह अलग तरह से व्यवहार नहीं करता है जब स्टडआउट निश्चित रूप से टर्मिनल नहीं है) ।

if output=$(some_command); then    printf 'some_command succeded, the output was «%s»\n' "$output"fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals बताते हैं if अधिक विस्तार से ।

कमांड और इको ओके / / इको विफल
< / कोड > < / पूर्व>

$? पिछली कमांड की निकास स्थिति होनी चाहिए, जो बिना किसी त्रुटि के शून्य होनी चाहिए ।

तो, कुछ ऐसा;

cd /nonexistantif [ $? -ne 0 ]then    echo failedelse    echo success!fi

अधिकांश मामलों के लिए, चेन कमांड के लिए और निर्माण का उपयोग करना आसान है जो एक दूसरे पर निर्भर होना चाहिए । तो cd /nonexistant && echo success! होगा नहीं इको सफलता क्योंकि आदेश से पहले टूट जाता है&;&;. इसका परिणाम है//, जहां cd /nonexistant || echo fail होगा इको विफल क्योंकि सीडी विफल। (यह उपयोगी हो जाता है यदि आप ||निकास जैसी किसी चीज़ का उपयोग करते हैं, जो पिछली कमांड विफल होने पर स्क्रिप्ट को समाप्त कर देगा । )

यह ध्यान दिया जाना चाहिए कि if...then...fi और &&/|| दृष्टिकोण का प्रकार कमांड द्वारा लौटाए गए निकास स्थिति से संबंधित है जिसे हम परीक्षण करना चाहते हैं( सफलता पर 0 ); हालाँकि, कुछ कमांड गैर-शून्य निकास स्थिति नहीं लौटाते हैं यदि कमांड विफल हो गया या इनपुट से निपट नहीं सका । इसका मतलब है कि सामान्य if और &&/|| दृष्टिकोण उन विशेष आदेशों के लिए काम नहीं करेगा ।

उदाहरण के लिए, लिनक्स जीएनयू पर file अभी भी 0 के साथ बाहर निकलता है अगर इसे तर्क के रूप में एक गैर-मौजूदा फ़ाइल प्राप्त हुई और find निर्दिष्ट फ़ाइल उपयोगकर्ता का पता नहीं लगा सका ।

$ find . -name "not_existing_file"                                          $ echo $?0$ file ./not_existing_file                                                  ./not_existing_file: cannot open `./not_existing_file' (No such file or directory)$ echo $?0

ऐसे मामलों में, एक संभावित तरीका जिससे हम स्थिति को संभाल सकते हैं, वह है पढ़ना stderr/stdin संदेश, उदाहरण के लिए वे जो लौट आए file कमांड, या कमांड के आउटपुट को पार्स करें जैसे find. उस उद्देश्य के लिए, case बयान का इस्तेमाल किया जा सकता.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  > case "$output" in > *"No such file or directory"*) printf "%s\n" "This will show up if failed";;> *) printf "%s\n" "This will show up if succeeded" ;;> esac> doneThis will show up if failed$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     File not found

( यह मेरे अपने उत्तर का एक प्रतिनिधि है संबंधित प्रश्न पर unix.stackexchange.com )

कमांड और इको $? / / गूंज $?
< / कोड > < / पूर्व>

जैसा कि कई अन्य उत्तरों में बताया गया है, का एक सरल परीक्षण $? इस तरह करेंगे

if [ $? -eq 0 ]; then something; fi

यदि आप कमांड का परीक्षण करना चाहते हैं विफल, आप एक छोटे संस्करण का उपयोग कर सकते हैं bash (लेकिन शायद ओवरकिल) इस प्रकार है:

if (($?)); then something; fi

यह उपयोग करके काम करता है (( )) अंकगणित मोड, इसलिए यदि आदेश वापस आ गया success, यानी $? = 0 फिर परीक्षण का मूल्यांकन करता है ((0)) जो परीक्षण के रूप में false, अन्यथा यह वापस आ जाएगा true.

के लिए परीक्षण करने के लिए सफलता, आप उपयोग कर सकते हैं:

if ! (($?)); then something; fi

लेकिन यह पहले उदाहरण से बहुत कम नहीं है ।

आसान डिबगिंग के लिए, मैं केवल आउटपुट त्रुटियों के साथ आदेश देता हूं:

तो [- टैग] [आदेश]

उसके बाद $? है 0 अगर सफलता, अन्यथा विफलता.

पसंद करते हैं** $(फू) बैकटिक्स पर `फू`**, क्योंकि आप इसे घोंसला कर सकते हैं, और एपोस्ट्रोफ से अलग करना आसान है ।

बीटीडब्ल्यू, आपको कॉल करने से पहले एक फ़ंक्शन (मान्य) को परिभाषित करना होगा ।

संबंधित: [एससी 2015: ध्यान दें कि ए और बी || सी नहीं है-तो-और । सी चल सकता है जब ए सच है।] (SC2015 · koalaman/shellcheck Wiki · GitHub)