نشر رمز الخروج للمتصل في حالة حدوث خطأ في الصدفة من البرنامج النصي الذي يحتوي على مصيدة خروج
سؤال
هل من الممكن نشر رمز الخروج للمتصل في حالة وجود خطأ في بناء الجملة في برنامج Bash النصي باستخدام مصيدة EXIT؟على سبيل المثال، إذا كان لدي:
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
بعد ذلك، يؤدي تشغيله إلى الحصول على رمز الخروج 0 حتى لو لم ينته البرنامج النصي بنجاح:
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
ولكن إذا قمت بالتعليق على مصيدة الخروج، فسيرجع البرنامج النصي 1.وبدلاً من ذلك، إذا استبدلت السطر الذي يحتوي على المتغير غير المنضم بأمر يُرجع قيمة غير صفرية (على سبيل المثال: /bin/false
)، يتم نشر قيمة الخروج هذه كما أرغب في ذلك.
المحلول 2
يرتبط هذا السلوك بإصدارات Bash المختلفة.يعمل النص الأصلي كما هو متوقع على Bash 4.2 ولكن ليس على 3.2.إن وجود التعليمات البرمجية المعرضة للخطأ في ملف نصي منفصل وتشغيله في غلاف فرعي يعمل على حل المشكلات الموجودة في إصدارات Bash السابقة:
#!/bin/bash
$BASH sub.sh
RETVAL=$?
if [[ "$RETVAL" != "0" ]]; then
echo "Dying!! Exit code: $RETVAL"
fi
sub.sh:
set -eu
echo yeah
echo $UNBOUND_VARIABLE
echo boo
نصائح أخرى
تخرج الصدفة بنتيجة آخر أمر تم تنفيذه.في حالة الفخ الخاص بك، هذا echo
, والتي عادة ما تعود بنجاح.
لنشر القيمة الخاصة بك، ببساطة exit
معها.
#!/bin/bash
set -eu
die() {
echo "Dying!!"
exit "$1"
}
trap 'die $?' EXIT
echo yeah
echo $unbound
echo boo
لاحظ ذلك أيضًا set -e
يعتبر ضارًا - فهو يجعلك تعتقد أن البرنامج النصي سينتهي في حالة فشل الأمر، وهو ما لن يحدث دائمًا.