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

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

تصميم معالجة حالة الأنابيب عمداً

افصل البيانات عن الحالة وافحص PIPESTATUS فوراً وافهم استثناءات errexit دون جعلها سياسة خطأ كاملة.

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

أهداف الدرس

  • شرح نتيجة الأنبوب الافتراضية وpipefail.
  • حفظ الحالات الفردية قبل استبدالها.
  • معالجة غير الصفري المتوقع وسياقات errexit صراحة.

يحمل الأنبوب بايتات ونتائج إكمال متعددة

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

يغير pipefail التجميع لا التفسير

تعيد pipefail أقصى غير صفري يميناً أو صفراً للجميع، لا الأول ولا تميز عدم التطابق الموثق من الخطأ. قد يسبب مستهلك يتوقف مبكراً SIGPIPE للمنتج بعد كفايته؛ ففسر بالعقد. افحص قابلية pipefail لبيئة sh ولا تفترضها. حد تغيير الخيار بالمساعد.

bash مقارنة سياستي تجميع الحالة
set +e
false | true
printf 'default=%s\n' "$?"
set -o pipefail
false | true
printf 'pipefail=%s\n' "$?"
الناتج المتوقع
default=0
pipefail=1

لا تنتج الأوامر بيانات وتعيد حالات مقصودة. يوضح المثال التجميع دون ملفات أو تطبيق حقيقي.

حفظ متجه المراحل فوراً

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

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

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

يتبع errexit السياق النحوي

يُعطل -e بسياقات موثقة كالشروط ومواضع القوائم والأنابيب. قد يجعل استدعاء الدالة شرطاً داخلها يعمل دون الخروج المتوقع. للاستبدال وراثة تشمل POSIX وinherit_errexit. اختبر البنية والإصدار. لـ ERR استثناءات ووراثة أيضاً ولا تجعل الفشل استثناءً عاماً. عالج مؤثر الصحة صراحة.

تصميم النجاح حول المراحل المطلوبة

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

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

إخفاء المستهلك فشل المنتج

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

قراءة PIPESTATUS بعد التسجيل

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

افتراض إيقاف -e كل فشل دالة

لماذا يحدث؟
يغير الاستدعاء المختبر السلوك.
كيف تصلحه؟
عالج المطلوب داخل الدالة صراحة.
كيف تتجنب تكراره؟
اختبر سياق الاستدعاء لا الجسم فقط.

اختبر فهمك

1. لماذا لا تصلح طباعة "$?" ثم PIPESTATUS؟

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

تصير printf الأحدث وتستبدل المتجه. احفظ PIPESTATUS بإسناد مصفوفة واحد واستخرج القرار منها دون أمر فاصل.

2. يعيد بحث عدم تطابق في أنبوب مطلوب. هل يوقف دائماً؟

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

إذا تطلب العقد تطابقاً فقط. ميز الغياب المتوقع من الخطأ وحدد الفرع. تكشف pipefail غير الصفري ولا تقرر معناه التطبيقي.

أهم ما تعلمته

  • احفظ نتائج المراحل قبل أي أمر.
  • عامل errexit سياقياً وصمم مسارات صريحة.

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