Bash / دليل حلول تحريري

تشخيص تقسيم الوسائط وتوسعة الأنماط غير المتوقعين

تتبع غلاف أمر افتراضي من الوسائط المستلمة عبر التوسعة وIFS والأنماط ومحلل خيارات البرنامج.

وقت القراءة التقريبي: 2 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

ينجح الغلاف للبسيط ويفشل للمسافة والفارغ والشرطة والنجمة. يرى المتلقي عدداً مختلفاً ولا تصلحه علامات اقتباس مخزنة. أعد الحدود بنصوص مصطنعة آمنة.

افهم الأسباب المحتملة

  • قد يقسم غير المقتبس بـ IFS ثم يطابق الملفات ويختفي الفارغ. لا يحفظ مفرد يجمع الوسائط حدودها. وبعد الاقتباس قد تفسر الأداة الشرطة خياراً فهذه واجهة مستقلة.

1. رصد الوسائط عند المتلقي

سجل الاستدعاء وحدد أول متلق خاطئ. استبدل الآثار بدالة تعرض العدد وقيمة محددة لكل وسيط. لا يعيد echo زخرفي الحدود وقد يخفي الفراغ. حد التتبع لحساسية القيم وأكد Bash للمصفوفات وأعد بمعزل لا بتعديل الإنتاج.

bash كشف حدود الوسائط المصطنعة
inspect() { printf 'argc=%s\n' "$#"; printf '<%s>\n' "$@"; }
value='red apple'
inspect "$value" '' '*'
الناتج المتوقع
argc=3
<red apple>
<>
<*>

يتلقى ثلاثاً بما فيها الفارغ والنجمة الحرفية دون طلب توسعة ملفات.

2. تتبع أول توسعة عادية غير مقتبسة

اتبع القيمة وحدد غير المقتبس لا تلُم الأداة الأخيرة. افحص تعديل IFS وهل النمط بيانات أو استعلام. ليست علامات المتغير قواعد مصدر فلا تجمع بأثر رجعي. اقتبس المفرد وامثل المتعدد قائمة منذ البداية.

3. استبدال النص المجمع بقائمة فعلية

استخدم مصفوفة عنصراً لكل وسيط و@ مقتبسة لأمر ثابت. لا تستخدم eval أو محللاً آخر. قيد الأمر واحفظ الفراغ. ولـ sh أعد بالمواضع أو تمثيل موثق لا مصفوفة تحت shebang عام. راجع كل التمرير فقد يبقى غير مقتبس لاحقاً.

bash التحقق من عقد الوسائط المصحح
receive() { [[ $# == 3 && $1 == 'red apple' && -z $2 && $3 == '*' ]]; }
args=('red apple' '' '*')
if receive "${args[@]}"; then printf 'PASS exact list\n'; else exit 1; fi
الناتج المتوقع
PASS exact list

يتحقق المتلقي من القيم لا عرض الأمر ويخفق المجمع أو غير المقتبس.

4. مراجعة المحلل التالي بعد الاقتباس

إذا وصلت سليمة وبقي السلوك فافحص الخيار والصيغة. قد تبقى -n المقتبسة خياراً؛ استخدم -- الموثقة أو مساراً مناسباً. ثبت صيغة printf وضع البيانات بـ %s. لا يخول الاقتباس المسار أو يحيد كل لغة؛ طبق عقد الطبقة التالية.

تحقق من نجاح الإصلاح

اختبر العادي والمسافة والفارغ والنجمة والشرطة والجديد المسموح، وتحقق من العدد والقيم ثم خيارات البرنامج مستقلة. افحص الخرج والحالة لا السجل البصري فقط.

امنع تكرار المشكلة

  • التزم بالاقتباس وافصل القائمة من الأمر واحفظ اختبارات الحدود. حد IFS وخيارات النمط بالمساعد ووثق البيانات مقابل البحث وارفض التمثيل غير المدعوم بدل تقييم إضافي.

المراجع الرسمية