Bash / دليل حلول تحريري

تحديد مزالق حالة الأنبوب وset -e

افحص برنامجاً يعلن النجاح بعد عمل جزئي بفصل حالات المراحل والفشل المتوقع وسياق errexit.

وقت القراءة التقريبي: 2 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

يحوي التقرير جزئياً معقولاً ويعيد الأخير صفراً ويكمل رغم -e. يتوقف المساعد مباشرة ويكمل في if. احفظ بنية المستدعي لأن عزله قد يزيل السبب.

افهم الأسباب المحتملة

  • تعكس النتيجة الأخير لا كل المطلوب. تغير pipefail التجميع لا معنى الفشل. لـ errexit وERR استثناءات قواعد واستدعاء، وقد يستبدل التسجيل أو local الحالة المطلوبة.

1. الإعادة بآمن في البنية نفسها

سجل العادي والشرط والنفي والقائمة والأنبوب والخيارات والإصدار. استبدل النشر أو الإدارة بمنتج مصطنع وحالات. افحص الجسم والمستدعي ولا تضف خيارات قبل مصدر الصفر. افصل التشخيص عن الجزئي كي لا تجمله.

bash ملاحظة errexit لدالة مختبرة
bash -e -c 'work() { false; printf "continued-inside-function\n"; }; if work; then printf "condition-succeeded\n"; fi'
الناتج المتوقع
continued-inside-function
condition-succeeded

المزلق المقصود غير قابل للتشغيل بالقارئ لكن تحقق خرجه الآمن. لا يوقف الفشل الدالة المختبرة وتنجح printf الأخيرة.

2. حفظ كل مراحل الأنبوب قبل التسجيل

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

bash كشف منتج فاشل خلف مستهلك ناجح
set +e
{ printf 'partial\n'; return_status=6; ( exit "$return_status" ); } | { while IFS= read -r line; do :; done; }
stages=("${PIPESTATUS[@]}")
printf 'producer=%s consumer=%s\n' "${stages[0]}" "${stages[1]}"
الناتج المتوقع
producer=6 consumer=0

ينتج سطراً ثم يعيد ستة بآخر ابن وتحفظ النسخة ستة وصفراً دون نشر حقيقي.

3. معالجة العمليات المطلوبة صراحة

استخدم if حول مؤثر الصحة واحفظ الحالة أول else. لا تعتمد الدالة خيار المستدعي وأعد غير صفري موثقاً ولا تدعه للتشخيص. افصل local عن الاستبدال الحساس. تفيد pipefail مع تحديد الغياب والاختياري والتحقق؛ لا يقرر المفتاح المتطلبات.

4. إبعاد الجزئي عن حد الإكمال

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

تحقق من نجاح الإصلاح

تحقق من الحالة وقبول المكتمل لكل فشل مضبوط ومن حفظ المراحل قبل الرسالة وكرر السياق الأصلي. أثبت رفض الجزئي وبقاء الغياب المتوقع.

امنع تكرار المشكلة

  • وثق المطلوب والاختياري واحفظ ملاصقاً وأعد الفشل بالدوال. احفظ اختبارات دالة الشرط والمنتج الجزئي ووثق الدعم لا خيارات كاستثناء شامل.

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