सवाल यह जांचने के लिए कि कोई आदेश सफल हुआ है या नहीं?


क्या आदेश देने में कोई त्रुटि है या नहीं, यह जांचने का कोई तरीका है?

उदाहरण :

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

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


162
2018-03-07 11:40


मूल


पसंद करते हैं $ (Foo) बैकटिक्स पर `foo`, क्योंकि आप इसे घोंसला कर सकते हैं, और apostrophes से अलग करना आसान है। - user unknown
बीटीडब्ल्यू, आपको एक फ़ंक्शन को परिभाषित करने की आवश्यकता है (valid) इससे पहले कि आप इसे बुलाओ। - wjandrea


जवाब:


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

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

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

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

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


240
2018-03-07 12:06



यह अच्छा है ... क्या मैं आउटपुट त्रुटि पकड़ सकता हूं ?? !! , क्योंकि इस मामले में मेरे पास 2 त्रुटि है: कमांड त्रुटि "पाठ" पूर्व, फ़ाइल नहीं मिली और मेरी त्रुटि "पाठ" जो इस मामले में है उदाहरण के लिए विफल - moata_u
@moata_u: आप मेरे उत्तर में दिखाए गए मान को वैरिएबल में संग्रहीत कर सकते हैं। - Lekensteyn
@moata_u: आपको एक डालने की आवश्यकता है ; से पहले else तथा fi: 'अगर ...; फिर ...; अन्य ...; फाई - Lekensteyn
यह है एक बेकार उपयोग test। - David Foerster
@Blauhirn [ $? ] (या समकक्ष, test $?) काम नहीं करता है क्योंकि $? एक संख्या (0, 1, आदि) का मूल्यांकन करता है जो शून्य नहीं है। देखें के लिए दस्तावेज़ test: "अगर अभिव्यक्ति छोड़ी जाती है, तो 'परीक्षण' झूठा रिटर्न देता है। यदि अभिव्यक्ति एक ही तर्क है, तो 'परीक्षण' गलत होता है यदि तर्क शून्य और सत्य है।" - Lekensteyn


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

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

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

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

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals बताते हैं if विस्तृत रूप में।


60
2018-03-08 23:54



क्या होगा यदि आप बूलियन को स्टोर करने की तरह ब्रांचिंग के अलावा कुछ और करना चाहते हैं, चाहे वह असफल हो या नहीं। फिर आपका आउटपुट वैरिएबल ऐसा नहीं करता है, लेकिन $? करता है, तो आप यह कहकर गलत हैं कि कमांड का परीक्षण सीधे कड़ाई से बेहतर है। - Timothy Swan


command && echo OK || echo Failed

19
2017-12-01 21:19



अगर command स्क्रीन पर त्रुटि देता है, इसे कैसे छिपाना है? - Sigur
अगर command stderr के लिए त्रुटियों को लिखता है, आप फॉर्म का उपयोग कर सकते हैं command 2> /dev/null && echo OK || echo Failed। 2> /dev/null stderr आउटपुट को रीडायरेक्ट करता है /dev/null। हालांकि, कुछ उपयोगिताओं stdout में त्रुटियां लिखेंगे (भले ही यह खराब अभ्यास है)। इस मामले में आप पुनर्निर्देशन से 2 को छोड़ सकते हैं, लेकिन आप कमांड से कोई आउटपुट खो देंगे। सफलता की जांच करने की यह विधि सरल टर्नरी तर्क के लिए अच्छी है लेकिन अधिक जटिल व्यवहार के लिए यह जांचना सर्वोत्तम है $? कमांड सफलता के लिए, या उपयोग करें if @ गीरा के जवाब में उल्लिखित ब्लॉक विधि। - Bender the Greatest


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

तो, कुछ पसंद है;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

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


12
2018-03-07 12:04



यह अच्छा है ... क्या मैं आउटपुट त्रुटि पकड़ सकता हूं ?? !! , क्योंकि इस मामले में मेरे पास 2 त्रुटि है: कमांड त्रुटि "पाठ" पूर्व, फ़ाइल नहीं मिली और मेरी त्रुटि "पाठ" जो इस मामले में है उदाहरण के लिए विफल - moata_u
@moata_u, देखें mywiki.wooledge.org/BashFAQ/002 - geirha


command && echo $? || echo $?

4
2017-08-12 16:01





के लिये प्रूफिंग में त्रुटि आपके आदेश:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

प्रेरित दुबला विनिर्माण में:


2
2017-12-29 04:20





इस बात पर ध्यान दिया जाना चाहिए कि 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
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

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


0
2017-11-13 18:58





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

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

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

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

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

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

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

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


0
2017-08-16 21:07