على جهاز Mac، ضع نمط حرف البدل بين علامتي اقتباس مفردتين لمنع صدفة zsh الافتراضية من توسيعه قبل تشغيل الأمر. على سبيل المثال، يمرر الأمر printf '%s\n' '*.csv' النص الحرفي *.csv كوسيطة واحدة. تتم إزالة علامات الاقتباس بواسطة الصدفة؛ وتصل علامة النجمة إلى البرنامج. إذا كان البرنامج نفسه يستخدم أنماطاً، فقد يفسر علامة النجمة تلك بعد ذلك.
لماذا يتغير حرف البدل قبل تشغيل الأمر
عندما تُدخل أمراً في Terminal، تعالج الصدفة وسيطاته قبل بدء تشغيل البرنامج. في zsh، يمكن لرمز * غير المحاط بعلامات اقتباس أن يؤدي إلى إنشاء أسماء الملفات (filename generation): حيث تستبدل الصدفة أسماء الملفات المطابقة بالنمط. إذا لم تكن هناك تطابقات، فإن zsh تُبلغ عادةً عن خطأ، على الرغم من أن خيارات الصدفة يمكن أن تغير هذا السلوك. يشرح دليل zsh إنشاء أسماء الملفات وسلوك عدم وجود تطابق.
تحدد Apple صدفة zsh كصدفة افتراضية في Terminal، على الرغم من إمكانية تكوين جهاز Mac لاستخدام صدفة أخرى. يوضح دليل Terminal من Apple الإعداد الافتراضي وكيفية تغييره. تُعد طريقة علامات الاقتباس المفردة الموضحة أدناه مناسبة لـ zsh وBash؛ وإذا كنت تستخدم صدفة مختلفة، فراجع دليلها لأن قواعد الاقتباس قد تختلف.
استخدام علامات الاقتباس المفردة للحصول على حرف بدل حرفي
اكتب نمط حرف البدل بين علامتي اقتباس مفردتين، مع الاحتفاظ بأي أحرف أخرى تنتمي إليه. على سبيل المثال:
printf '%s\n' '*.csv'
النتيجة هي النص الحرفي *.csv، سواء كان الدليل الحالي يحتوي على ملفات CSV أم لا. يتلقى printf النمط كوسيطة ويطبعه؛ ولا تقوم الصدفة بتوسيع علامة النجمة. علامات الاقتباس هي جزء من بناء جملة الصدفة (syntax)، لذا لا يتم تضمينها في الوسيطة. يوضح دليل البرمجة النصية للصدفة من Apple أن علامات الاقتباس المفردة تعطل توسيع الصدفة داخل النص المقتبس. Apple: التحكم في التدفق والتوسيع والتحليل.
هذا الأمر مهم بشكل خاص عندما يتوقع أحد البرامج معالجة النمط بنفسه. على نظام macOS، على سبيل المثال، يمكن للأمر find مطابقة أسماء الملفات باستخدام النمط المقدم إلى -name:
find . -type f -name '*.log'
هنا، تُمرر الصدفة *.log حرفياً إلى find؛ ثم يطبق find مطابقته الخاصة لأسماء الملفات على الملفات الموجودة أسفل الدليل الحالي. يمنع الاقتباس الصدفة من استبدال النمط بالأسماء الموجودة في الدليل الحالي قبل أن يتمكن find من استخدامه. يعتمد معنى النمط على البرنامج المتلقي: حيث يتحكم اقتباس الصدفة في توسيع الصدفة، وليس في كيفية تفسير البرنامج لوسيطته.
متى تستخدم الشرطة المائلة العكسية بدلاً من ذلك
بالنسبة للأنماط القصيرة، يمكن للشرطة المائلة العكسية (backslash) حماية حرف بدل فردي خارج علامات الاقتباس:
printf '%s\n' \*.csv
يؤدي هذا أيضاً إلى تمرير علامة النجمة حرفياً. غالباً ما تكون علامات الاقتباس المفردة أسهل في القراءة عندما يحتوي النمط على عدة أحرف خاصة أو مسافات أو أقواس معقوفة. على سبيل المثال، يمنع 'chapter [0-9]*.txt' الصدفة من تفسير الأقواس وحرف البدل. توثق Apple الاقتباس بالشرطة المائلة العكسية وسلوك علامات الاقتباس المفردة في دليل البرمجة النصية للصدفة الخاص بها.
أخطاء الاقتباس الشائعة
لا تحمي علامات الاقتباس المزدوجة كل أحرف الصدفة بشكل موثوق. فهي تمنع توسيع أحرف البدل في zsh، لكنها تظل تسمح ببعض عمليات التوسيع، بما في ذلك المتغيرات مثل $name واستبدالات الأوامر مثل $(command). بالنسبة للنمط الذي يجب أن يصل تماماً كما تم كتابته، استخدم علامات الاقتباس المفردة ما لم تكن الوسيطة بحاجة إلى إحدى عمليات التوسيع تلك.
لا يمكن أن تظهر علامة الاقتباس المفردة داخل سلسلة محاطة باقتباس مفرد كحرف عادي. إذا كان النمط نفسه يحتوي على فاصلة عليا (apostrophe)، فأغلق الجزء المقتبس، وأضف الفاصلة العليا باستخدام طريقة اقتباس أخرى، ثم أعد فتح علامات الاقتباس المفردة؛ توضح Apple تقنية اقتباس الصدفة هذه في دليلها. بالنسبة للأنماط غير المعتادة، افحص الأمر الدقيق بعناية قبل تشغيله.
ميّز أيضاً بين توسيع الصدفة وسلوك البرنامج المتلقي. إن وضع *.log بين علامتي اقتباس لا يُجبر البرنامج على معاملة علامة النجمة كحرف عادي؛ بل يضمن فقط أن تمررها الصدفة دون تغيير. قد تفسر أداة مساعدة مثل find -name هذا الرمز كنمط، بينما قد يتعامل معه أمر آخر بشكل حرفي. تحقق من وثائق ذلك الأمر نفسه عندما يكون هذا التمييز مهماً.
فحص سريع قبل الضغط على Return
اسأل نفسك عما يجب أن يتلقاه البرنامج. إذا كان بحاجة إلى نمط حرف بدل، فضع النمط بين علامتي اقتباس مفردتين وتأكد من تعيين خيارات الأمر لتفسير الأنماط على النحو المنشود. إذا كان يجب أن يتلقى البرنامج اسم ملف فعلي، فاترك توسيع الصدفة مُمكناً حيثما كان ذلك مناسباً، أو أدخل اسم الملف مباشرة. النقطة الأساسية هي استخدام الاقتباس عند حدود الصدفة عندما تريد أن يتلقى البرنامج أحرف البدل نفسها.
المصادر
14 التوسيع (zsh) — zsh.sourceforge.io
تغيير الصدفة الافتراضية في Terminal على Mac — دعم Apple
التحكم في التدفق والتوسيع والتحليل — Apple Developer