Bash Best Practices: كيف تكتب سكربتات موثوقة وقابلة للصيانة
كتابة سكربت يعمل مرة واحدة شيء، وكتابة سكربت موثوق في الإنتاج شيء آخر.
في هذا الدرس ستتعلم Best Practices تجعل سكربتات Bash أكثر أمانًا وثباتًا وسهولة صيانة.
ابدأ كل سكربت بإعدادات أمان واضحة
#!/usr/bin/env bash
set -euo pipefail
-e: توقف عند أول خطأ-u: خطأ عند استخدام متغير غير معرفpipefail: فشل الـ pipeline إذا فشل أي جزء
استخدم Shebang مناسب
#!/usr/bin/env bash
هذا أكثر مرونة بين الأنظمة مقارنةً بمسار ثابت في بعض البيئات.
اقتبس المتغيرات دائمًا
# صحيح
cp "$SOURCE_FILE" "$DEST_DIR/"
# غير آمن
cp $SOURCE_FILE $DEST_DIR/
عدم الاقتباس قد يسبب أخطاء عند وجود مسافات أو أحرف خاصة.
استخدم أسماء واضحة وثابتة
BACKUP_SOURCE="/etc"
BACKUP_DEST="/var/backups"
LOG_FILE="/var/log/backup-script.log"
تجنب الأسماء الغامضة مثل x أو tmp1 في السكربتات الجدية.
تحقق من المدخلات مبكرًا
if [ "$#" -lt 1 ]; then
echo "Usage: $0 "
exit 1
fi
Validation مبكر يوفر وقتًا كبيرًا في التشخيص لاحقًا.
استخدم دوال logging بدل echo عشوائي
log_info() { echo "[INFO] $*"; }
log_warn() { echo "[WARN] $*" >&2; }
log_error() { echo "[ERROR] $*" >&2; }
هذا يوحد شكل الرسائل ويسهّل تتبع الأعطال.
تعامل مع الأخطاء بشكل صريح
if ! systemctl is-active --quiet nginx; then
log_error "nginx is not running"
exit 1
fi
لا تفترض النجاح. تحقّق دائمًا من النتيجة.
استخدم دوال وتنظيم Main
main() {
validate_args "$@"
run_backup
cleanup
}
main "$@"
يجعل تدفق السكربت واضحًا ويقلل التعقيد.
استخدم trap للتنظيف عند الخروج
TMP_FILE=$(mktemp)
trap 'rm -f "$TMP_FILE"' EXIT
يضمن حذف الملفات المؤقتة حتى لو توقف السكربت بخطأ.
تجنب أوامر خطرة بدون حماية
# خطر
# rm -rf "$TARGET_DIR"
# أفضل
if [ -n "${TARGET_DIR:-}" ] && [ -d "$TARGET_DIR" ]; then
rm -rf "$TARGET_DIR"
fi
rm -rf مع متغيرات غير متحقق منها.
افصل الإعدادات عن المنطق
# config.env
APP_ENV=production
BACKUP_RETENTION_DAYS=7
# script.sh
source ./config.env
هذا يسهل تعديل السلوك دون تغيير الكود الأساسي.
افحص السكربت بأدوات مساعدة
bash -n script.sh
shellcheck script.sh
| الأداة | الفائدة |
|---|---|
bash -n |
فحص syntax |
shellcheck |
كشف مشاكل جودة وأخطاء شائعة |
تمرين عملي: تحسين سكربت بسيط وفق Best Practices
#!/usr/bin/env bash
set -euo pipefail
log_info() { echo "[INFO] $*"; }
main() {
if [ "$#" -lt 1 ]; then
echo "Usage: $0 "
exit 1
fi
local name="$1"
log_info "Hello $name"
}
main "$@"
إذا السكربت يعرض usage بدون argument ويعمل بشكل سليم مع argument، فأنت طبقت المبادئ الأساسية.
FAQ: أسئلة شائعة حول Bash Best Practices
ما أهمية set -euo pipefail في Bash؟
يساعد على إيقاف السكربت عند الأخطاء، منع استخدام متغيرات غير معرفة، وكشف أخطاء الـ pipelines مبكرًا.
لماذا يجب اقتباس المتغيرات في Bash؟
لمنع مشاكل المسافات والـ globbing غير المتوقع، خاصة عند التعامل مع المسارات وبيانات المستخدم.
كيف أجعل سكربت Bash أسهل في الصيانة؟
قسّم السكربت إلى دوال، استخدم أسماء واضحة، أضف logs مفيدة، واكتب checks مبكرة للمدخلات.