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

لينكس / المتوسط: فهم إدارة النظام / الدرس 7

كتابة برامج صدفة بعقود صريحة

حوّل الأوامر إلى برامج Bash قابلة للصيانة مع فحص المدخلات وضبط الوسائط ومعالجة الفشل عمداً.

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

أهداف الدرس

  • فحص الوسائط الموضعية وإرجاع حالات ذات معنى.
  • استخدام الشروط والحلقات والدوال والمصفوفات بصورة مناسبة.
  • معالجة التنظيف والفشل دون الاعتماد على set -e وحده.

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

يحدد البرنامج المفيد الوسائط المقبولة وما يكتبه وكيف يبلغ عن الفشل. اختر Bash صراحة عند استخدام المصفوفات أو شروط [[؛ فقد يكون /bin/sh صدفة أخرى. يختار سطر shebang المفسر عند تشغيل الملف التنفيذي مباشرة، بينما يختار bash file مفسر Bash مهما كان السطر الأول. ضع البيانات في الخرج القياسي والتشخيصات في الخطأ القياسي. افحص عدد الوسائط قبل توسعتها، ووثق قبول القيمة الغائبة أو الفارغة أو المسار غير الموجود.

bash برنامج كامل لفحص الوسائط
#!/usr/bin/env bash
if (( $# != 1 )); then
  printf 'usage: greet NAME
' >&2
  exit 2
fi
printf 'Hello, %s
' "$1"

احفظه باسم greet.sh وادرس bash greet.sh Mina: يطبع Hello, Mina. يطبع العدد الخاطئ رسالة الاستخدام في الخطأ القياسي ويخرج بالحالة 2. الاسم بيانات لا صياغة تنفيذية.

تفحص الشروط الأوامر والقيم

تستخدم if حالة خروج أمر الشرط. اختبر الأمر مباشرة بـ if command; then بدلاً من قراءة $? بعد عمل آخر. يفحص [[ -f "$path" ]] في Bash كون المسار ملفاً عادياً، لكنه لا يضمن نجاح الفتح لاحقاً، فقد تغير عملية أخرى نظام الملفات بين الفحص والاستخدام. استخدم الفحص لتوضيح التشخيص مع معالجة فشل العملية الفعلية. وتستخدم الشروط الحسابية (( expression ))، وتتعلق حقيقتها بقيمة التعبير لا بالنص المطبوع.

حفظ حدود السجلات وقوائم الوسائط

تزور حلقة for على "${items[@]}" عناصر مصفوفة Bash دون تقسيم مسافاتها. وتحفظ while IFS= read -r line المسافات البادئة والشرطات الخلفية في الإدخال السطري. عالج السطر الأخير غير المنتهي إذا سمح العقد به. لا تكرر على $(ls): يحذف الاستبدال الأسطر الجديدة النهائية ثم تقسّم التوسعة غير المقتبسة الأسماء. تجمع الدوال السلوك وتستخدم متغيرات local لتجنب تعديل حالة المستدعي. قيمة return حالة خروج؛ أعد النص عبر الخرج أو اصطلاح متغير واضح.

bash حفظ وسيطين متعددي الكلمات
#!/usr/bin/env bash
show_items() {
  local item
  for item in "$@"; do
    printf '<%s>
' "$item"
  done
}
items=('red apple' 'green pear')
show_items "${items[@]}"
الناتج المتوقع
<red apple>
<green pear>

تتلقى الدالة وسيطين وتطبع سطرين بين قوسين. تحفظ توسعة المصفوفة المقتبسة كل عنصر بدلاً من إنشاء أربع كلمات منفصلة.

إظهار سياسة الفشل

قد يكشف set -u توسعة متغير غير مضبوط عن غير قصد، ويساعد pipefail في رصد فشل مراحل الأنابيب. لدى set -e استثناءات تعتمد على سياق الشروط والقوائم والدوال والأنابيب، فلا يشكل تصميماً كاملاً لمعالجة الأخطاء. عالج صراحة بـ if أو || العمليات التي يغير فشلها النتيجة. واحفظ حالة الفشل قبل طباعة التشخيص. حدد المتوقع والقابل لإعادة المحاولة وما يوقف البرنامج. قد تكون حالة grep لعدم التطابق فرعاً صالحاً لا حادثاً قاتلاً.

التنظيف جزء من الصحة

استخدم mktemp لأسماء مؤقتة خاصة بدلاً من مسار مشترك متوقع. سجّل التنظيف بعد نجاح إنشاء المورد، واقتبس كل مسار، واجعله يتحمل العمل غير المكتمل. يعمل فخ EXIT عند الخروج المعتاد، لكنه لا يعالج كل انقطاع مثل SIGKILL أو فقدان الطاقة. لا تعتمد على الفخ لحفظ النسخة الوحيدة من بيانات مهمة. ابنِ الخرج في ملف منفصل وتحقق منه ثم استخدم إعادة تسمية مناسبة ضمن نظام الملفات نفسه عند الحاجة إلى النشر الذري.

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

فشل برنامج Bash تحت sh

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

تقسيم الحلقة لأسماء الملفات

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

لم يلتقط set -e فشلاً

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

اختبر فهمك

1. اكتب سياسة برنامج يقبل ملف تقرير واحداً قابلاً للقراءة.

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

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

2. لماذا لا يكفي فخ التنظيف استراتيجيةً وحيدة للنسخ الاحتياطي؟

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

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

أهم ما تعلمته

  • اعتبر المفسر وصيغة الإدخال والفشل عقداً.
  • احفظ حدود الوسائط وعالج الفشل المهم صراحة.

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