الاقتباس الآمن
Safe Quoting
الاقتباس الآمن — Safe Quoting
إذا خرجت من مسار Bash بقاعدة واحدة، فلتكن هذه: اقتبس المتغيرات. "$file" أفضل من $file في أغلب الحالات. الاقتباس يمنع word splitting وglobbing غير المقصود. هذا ليس جمالاً أسلوبياً؛ هو أمان. مسار يحتوي مسافة أو نجمة قد يغير سلوك الأمر بالكامل.
الخطر يكبر مع أوامر مثل rm, cp, mv, وrsync. لا تمرر متغيراً غير مقتبس لهذه الأوامر. تحقق أيضاً أن المتغير ليس فارغاً عندما يكون ضرورياً. rm -rf "$target" ما زال خطراً إذا كان target قيمة غير صحيحة، لكنه أقل فوضى من نسخة غير مقتبسة.
الاقتباس ضروري لكنه غير كافٍ — rm -rf
الاقتباس يمنع word-splitting، لكنه لا يمنع القيمة الخاطئة. مثال: rm -rf "$target" آمن من المسافات، لكن ليس من:
target=""— يصبحrm -rfبمعامل فارغ أو يعمل على المجلد الحاليtarget="/"— يحذف كل شيءtargetغير معرّف — إذا لم تكنset -uمفعّلة، يصبحrm -rf
الحل: تحقق صريح قبل كل أمر تدميري:
${target:?message} تُوقف السكربت برسالة إذا كان target فارغاً أو غير معرّف، حتى بدون set -u. الطبقة الثانية تضيف حماية ضد القيم الخطرة المعرّفة.
مثال آمن
لا يظهر الخطر في echo غالباً، لكنه يظهر مع الأوامر التي تفسر المعاملات. لذلك تعود على الاقتباس حتى في الأمثلة الصغيرة.
متى لا تقتبس؟
هناك حالات قليلة مثل glob مقصود: for file in *.md; do. هنا لا تقتبس *.md لأنك تريد من shell توسيع النمط. لكن داخل الحلقة، اقتبس "$file".