AzLearn

الوضع الصارم

Strict Mode

مفهوم ~18 دقيقة

الوضع الصارم — Strict Mode

السطر set -euo pipefail يظهر في معظم أمثلة هذا المسار لأنه يغير طريقة فشل السكربت. -e تجعل السكربت يتوقف عند فشل أمر غير متوقع. -u تجعل استخدام متغير غير معرف خطأ. pipefail تجعل pipeline يفشل إذا فشل أي جزء مهم منه، وليس الأمر الأخير فقط.

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

مع -u، إذا كتبت $target دون تعريفه سيفشل السكربت. هذا ممتاز لأنه يكشف typo مبكراً. وإذا كنت تريد قيمة اختيارية، استخدم صيغة آمنة مثل ${target:-default} أو تحقق منها صراحة.

نمطا الفشل تحت الوضع الصارم

لنكن دقيقين في ما يعنيه -u فعلاً. هناك فشلان مختلفان يجب أن تفهمهما قبل الكتابة:

الفشل الأول — متغير غير معرف: إذا طبعت echo "$safe" وأنت لم تعرّف safe أبداً، يخرج السكربت فوراً برسالة مثل bash: safe: unbound variable. هذا بالضبط ما تريده؛ الوضع الصارم يمنع السكوت على متغير يُنسى.

الفشل الثاني — عدم الاقتباس: لو كتبت echo $safe (بدون اقتباس) في سكربت بدون -u، قد يعطي نتيجة فارغة بصمت. الاقتباس وحده لا يكفي؛ التعريف ضرورة.

الحل الصريح لكليهما: عرّف المتغير بقيمة واضحة (safe="on") ثم اقتبسه عند استخدامه (echo "safe=$safe"). لا تستخدم الشكل ${safe:-on} كحل أول لأنه يُخفي الخطأ بدل إظهاره.

مثال عملي

script.sh

الوضع الصارم لا يعني أن السكربت أصبح صحيحاً تلقائياً. ما زلت تحتاج اقتباساً، تحققاً، ورسائل واضحة. لكنه يرفع مستوى الفشل من “صامت ومربك” إلى “مبكر وقابل للفهم”.

متى لا تستخدمه؟

نادراً في سكربتات حديثة. قد تجد سكربتات قديمة لا تتحمل -u لأنها تعتمد على متغيرات غير معرفة. لا تصلحها بإزالة الوضع الصارم فقط؛ افهم أين القيم الاختيارية وأضف افتراضات صريحة.

تحدي — Challenge