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 مبكرة للمدخلات.

الخطوة التالية

في الدرس القادم سنبدأ قسم أمن Linux بأساسيات الحماية.

التالي: Security Basics
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن