تلات مفاتيح في أول الملف
بعد الـ shebang على طول:
#!/usr/bin/env bashset -euo pipefailأي أمر يفشل، السكربت يوقف. من غيره بيكمل بعد الغلط وانت فاكر إن الخطوات كلها حصلت.
استخدام متغير مش متعرّف يوقع السكربت. بيمسك غلطة إملائية زي $nme بدل $name.
لو أمر في نص الماسورة فشل، السلسلة كلها تفشل. من غيره آخر أمر بس هو اللي بيتشاف.
set -e مش بيمسك كل حاجة. أمر في شرط if مسموح يفشل، لأنك بتسأل. cmd || true بيبلع الفشل عن قصد. متبلعهاش عشان تسكت غلطة مش فاهمها.
دوّر على الغلط قبل ما تدور في الناتج
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 محدش هيفهمه بعد شهر أغلى من عشر سطور باينتين.