محتويات الدورة

Bash / المتوسط: بيانات ومسارات فشل موثوقة / الدرس 9

استخدام الفخاخ لمعالجة عمر محدودة

احفظ الحالة وثوابت التنظيف مع حدود توقيت الإشارة ووراثة الفخ والانقطاع.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • فصل تنظيف EXIT عن تشخيص ERR.
  • حفظ الحالة المحفزة عبر التنظيف.
  • تصميم تنظيف قابل للتكرار للجزئي دون ضمان شامل.

الفخ شيفرة صدفة عند حدث عمر

يسجل trap فعلاً لإشارة أو حدث كالخروج. يُحلل لاحقاً فيحدد الاقتباس توسعة وقت التسجيل أو التنفيذ. فضل دالة تنظيف واضحة على سلسلة مستوفاة طويلة. يدعم EXIT المسارات المعتادة لا الطاقة أو SIGKILL. احم الدائم مستقلاً وليكمل الفخ العقد لا يكون موضع القرار الوحيد.

حفظ الحالة الداخلة قبل أوامر التنظيف

يستبدل التنظيف $? فاحفظها فوراً وقرر أثر فشله. غالباً يبقى الأصلي أولياً ويبلغ التنظيف مستقلاً. تحمل ما لم يُنشأ أو حُرر وسجل بعد إثبات الملكية واقتبس المسارات. نستخدم حالة مصطنعة ومؤقتاً خاصاً ولا نحذف عشوائياً أو نجعل الفخ تصريحاً للتدمير.

bash ملاحظة الحالة الأصلية عبر EXIT
bash -c 'cleanup() { status=$?; printf "exit-status=%s\n" "$status"; }; trap cleanup EXIT; exit 7'
child_status=$?
printf 'observed=%s\n' "$child_status"
الناتج المتوقع
exit-status=7
observed=7

يخرج ابن مؤقت بسبعة ويطبع فخه القيمة المحفوظة ويرصدها الأب ثم ينتهي بنجاح.

تؤثر الإشارة والانتظار في التوقيت

لا يعني الفخ مقاطعة كل خارجي فوراً. لـ Bash سلوك عند انتظار الأمامي وwait غير المتزامن. قد تغير الإشارة نتيجة wait ولا تلغي سياسة الأبناء. لا يعالج SIGKILL أو SIGSTOP. حدد الأبناء واطلب الفعل الموثق وانتظر محدوداً واحفظ الحالة. لا تستهدف تخميناً أو أسماء عامة؛ نقتصر على أبناء المثال.

يتبع ERR الاستثناءات والوراثة

ERR حدث Bash باستثناءات قريبة من errexit. قد لا يحفزه فشل مختبر أو منفي أو في قوائم وأنابيب. تعتمد وراثة الدوال والاستبدال الخيارات والسياق. يفيد الرصد لا الاستثناء العام. عالج المطلوب واختبر المستدعي، ولا تطبع المتغيرات والأوامر لكشف الأسرار عند الفشل.

اختبار التقدم الجزئي والتنظيف المتكرر

تحمل الفشل قبل التخصيص وبعده وبعد النشر. تتبع الملكية وافصل المؤقت عن النسخة المهمة الوحيدة. يعني التكرار عدم إنشاء خطأ آخر أو مس غير متعلق. فضل أسماء خاصة بأداة مدعومة على المتوقع المشترك. اختبر العلامات الآمنة قبل الموارد. يوضح المثال انتقال حالة فقط؛ للحذف تصميم مراجع مستقل.

bash جعل تنظيف الحالة المصطنعة قابلاً للتكرار
released=0
cleanup() {
  if (( released == 0 )); then
    released=1
    printf 'released\n'
  fi
}
cleanup
cleanup
printf 'state=%s\n' "$released"
الناتج المتوقع
released
state=1

ليس للثاني أثر إضافي، ويتحقق نمط الملكية دون حذف أو إشارة.

الأخطاء الشائعة وإصلاحها

إبلاغ التنظيف حالة المسجل

لماذا يحدث؟
استُبدلت الأصلية أولاً.
كيف تصلحه؟
احفظ الداخلة قبل أي أمر.
كيف تتجنب تكراره؟
اختبر خروجاً غير صفري مضبوطاً.

اعتبار الفخ حماية تخزين ضد كل عطل

لماذا يحدث؟
أُهمل غير القابل للالتقاط وفشل الجهاز.
كيف تصلحه؟
احفظ نسخاً وقواعد نشر مستقلة.
كيف تتجنب تكراره؟
وثق ما لا يضمنه التنظيف.

توقع ERR لكل أمر غير صفري

لماذا يحدث؟
أُهملت استثناءات القواعد والوراثة.
كيف تصلحه؟
عالج المهم واختبر السياقات.
كيف تتجنب تكراره؟
استخدم ERR تشخيصاً مساعداً.

اختبر فهمك

1. ماذا يفعل التنظيف إذا فشل التخصيص قبل تسجيل الملكية؟

اعرض الحل المشروح

يعرف غياب المورد ولا يمس غيره. استخدم تهيئة وعلامة ملكية لا مساراً افتراضياً مخمناً واختبره مستقلاً.

2. لماذا يتجاوز فشل مختبر رسالة ERR متوقعة؟

اعرض الحل المشروح

يتبع ERR استثناءات التحكم ويستهلك الشرط الفشل. ضع القرار في الفرع واجعل الرسالة دليلاً إضافياً لا الآلية الوحيدة.

أهم ما تعلمته

  • احفظ الحالة والملكية قبل التنظيف.
  • اختبر الفخ بسياق الإشارة والاستدعاء.

المراجع الرسمية