سؤال كيف تتحقق من نجاح الأمر؟


هل هناك أي طريقة للتحقق مما إذا كان هناك خطأ في تنفيذ الأمر؟

مثال:

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`، لأنه يمكنك تداخلها ، ومن الأسهل التمييز بين الفواصل العليا. - 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: "إذا تم حذف EXPRESSION ، فإن" test "يُرجع false. إذا كانت EXPRESSION عبارة عن وسيطة واحدة ، فإن" test "يعرض false إذا كانت الوسيطة خالية وصحيحًا بخلاف ذلك." - 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



ماذا لو كنت تريد القيام بشيء آخر غير المتفرعة مثل تخزين القيمة المنطقية سواء فشلت أم لا في .ini؟ ثم متغير الناتج الخاص بك لا يفعل ذلك ، ولكن $? ، لذا فأنت غير صحيح في القول إن اختبار الأمر بشكل مباشر أفضل. - 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 يعيد توجيه إخراج ستدر /dev/null. ومع ذلك ، ستقوم بعض الأدوات المساعدة بكتابة الأخطاء إلى stdout (على الرغم من أن هذه هي ممارسة سيئة). في هذه الحالة ، يمكنك حذف 2 من إعادة التوجيه ، لكنك ستفقد أي إخراج من الأمر. هذه الطريقة في التحقق من النجاح جيدة للمنطق الثلاثي البسيط ولكن بالنسبة للسلوك الأكثر تعقيدًا ، فمن الأفضل التحقق من ذلك $? لنجاح القيادة ، أو استخدام if طريقة الكتلة المذكورة في الإجابة عن @ geirha. - Bender the Greatest


$؟ يجب أن يحتوي على حالة الخروج للأمر السابق ، والتي يجب أن تكون صفراً بدون أخطاء.

إذن ، شيء من هذا القبيل ؛

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

في معظم الحالات ، يكون من الأسهل استخدام && construct في أوامر السلسلة التي تحتاج إلى الاعتماد على بعضها البعض. وبالتالي cd /nonexistant && echo success! سيكون ليس صدى النجاح لأن الأمر يكسر قبل &&. النتيجة الطبيعية لهذا هو || أين cd /nonexistant || echo fail  سيكون صدى تفشل بسبب فشل مؤتمر نزع السلاح. (يصبح هذا مفيدًا إذا كنت تستخدم شيء ما مثل: exit ، والذي سينهي البرنامج النصي إذا فشل الأمر السابق.)


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 (ولكن ربما مبالغة) على النحو التالي:

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

هذا يعمل عن طريق استخدام (( )) وضع الحساب ، لذلك إذا عاد الأمر success، أي $? = 0 ثم يقيس الاختبار ل ((0)) الذي اختبارات false، وإلا فإنه سيعود true.

لاختبار نجاح، يمكنك استخدام:

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

لكنها بالفعل ليست أقصر بكثير من المثال الأول.


0
2017-08-16 21:07