السكربت · فصل ٦

سكربت مبيقعيش وهو نايم

set -euo pipefail · shellcheck · bash -x · quoting
🎯 الهدف: تخلي السكربت يوقف عند الغلط، وتلاقي السبب، وتعرف امتى الشيل مش الأداة الصح.

تلات مفاتيح في أول الملف

بعد الـ shebang على طول:

script.sh
#!/usr/bin/env bashset -euo pipefail
set -e

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

set -u

استخدام متغير مش متعرّف يوقع السكربت. بيمسك غلطة إملائية زي $nme بدل $name.

pipefail

لو أمر في نص الماسورة فشل، السلسلة كلها تفشل. من غيره آخر أمر بس هو اللي بيتشاف.

set -e مش بيمسك كل حاجة. أمر في شرط if مسموح يفشل، لأنك بتسأل. cmd || true بيبلع الفشل عن قصد. متبلعهاش عشان تسكت غلطة مش فاهمها.

دوّر على الغلط قبل ما تدور في الناتج

terminal
bash -x ./count-dir.sh /tmp

-x يطبّع كل أمر بعد ما السطر يتفك، وقبله علامة +. هتشوف القيمة الحقيقية مش اللي أنت متخيّلها. للسكربت الطويل، حط set -x حوالين الحتة المتهمة وبعدين set +x.

أداة ShellCheck تقرا الملف وتقول: متغير من غير تنصيص، ls في لوب، شرط ناقص مسافة. شغّلها قبل ما السكربت يوصل لسيرفر. المحرر غالبًا يلحقها لو الإضافة متسطّبة.

-x يورّيك حصل إيه. ShellCheck يورّيك الغلط قبل ما يحصل.

عادات بتفرق

  • حط "$var" و "$@" دايمًا، إلا لو قاصد تقطيع.
  • امسحات بمسار مطلق اتأكدت منه، مش rm -rf "$dir" من غير ما تتأكد إن dir مش فاضي ومش /.
  • متكتبش كلمة سر في السكربت. خدها من متغير محيط أو من ملف صلاحياته للمالك بس.
  • cd في السكربت مع set -e يوقف لو الفولدر مش موجود. من غير -e، باقي الأوامر تشتغل في الفولدر الغلط.
  • مسار فيه مسافة طبيعي على أجهزة الناس. لو سكربتك بيقع عليه، التنصيص ناقص.
  • mktemp يعمل ملف أو فولدر مؤقت باسم عشوائي. أحسن من /tmp/out ثابت يتسابك عليه برنامج تاني.

الشيل مش لكل البرامج

سكربت الشيل ممتاز يلزق أوامر موجودة: ينسخ، يشغّل curl، يقرّر يكمل ولا لأ، يظبط سيرفر. أول ما يبقى عندك JSON متشعب، أو حساب، أو واجهة، الأوضح Python أو اللغة اللي المشروع أصلًا بيها. سطر awk محدش هيفهمه بعد شهر أغلى من عشر سطور باينتين.

خلّصت الفصل لما

🧠 اختبر نفسك
١) pipeline آخره wc نجح وأوله grep فشل. مين اللي السكربت هيشوفه من غير pipefail؟
نجاح، لأن آخر أمر بس هو اللي بيتحسب.
٢) set -u بيمسك إيه؟
قراءة متغير مش متعرّف.
٣) أمر جوه if فشل، والسكربت عليه set -e. هيوقف؟
لأ. الفشل في الشرط متاح لأنك بتختبره.