إذا كان البرنامج النصي المنسوخ من Windows يبدو طبيعيًا ولكن macOS يُبلغ عن "bad interpreter" أو يتصرف كما لو أن الأوامر تحتوي على حرف إضافي، فتأكد من وجود نهايات أسطر CRLF الخاصة بـ Windows. تتوقع أدوات سطر أوامر macOS وجود LF. يمكنك تأكيد نوع الملف، وتحويل نسخة منه باستخدام الأدوات المتوفرة بالفعل على macOS، ثم تشغيل البرنامج النصي الذي تم إصلاحه مرة أخرى.

لماذا تؤدي نهايات الأسطر إلى فشل البرنامج النصي على macOS

نهاية السطر هي حرف (أو زوج من الأحرف) يحدد نهاية سطر النص. تستخدم أدوات سطر أوامر macOS الحرف LF (\n)؛ بينما يستخدم Windows بشكل شائع CRLF (\r\n). مع وجود CRLF، يمكن أن يظل حرف الرجوع إلى بداية السطر (carriage return) ملحقًا بالسطر عندما يقرؤه أمر Unix. توضح وثائق Apple أن هذا الحرف الإضافي يمكن أن يسبب سلوكًا غير متوقع في أدوات وسكربتات سطر الأوامر. دليل البرمجة النصية لـ shell من Apple

تشمل المؤشرات الشائعة /bin/bash^M: bad interpreter، أو رسالة command-not-found تبدو وكأنها تتضمن \r لاحقًا، أو فشل التحليل النحوي حتى لو كان البرنامج النصي المرئي يبدو صحيحًا. يمكن أن تنجم هذه الأعراض عن أسباب أخرى؛ لذا فإن فحص الملف يعد خطوة أولى مفيدة، وليس دليلاً قاطعًا في حد ذاته.

تحقق من تنسيق نهاية السطر للبرنامج النصي

افتح Terminal، وانتقل إلى المجلد الذي يحتوي على البرنامج النصي، وافحصه باستخدام file. ضع اسم الملف بين علامتي اقتباس حتى يتم التعامل مع المسافات والأحرف الخاصة (metacharacters) حرفيًا:

cd "$HOME/Downloads"
file "my script.sh"

إذا أوضحت المخرجات أن الملف يحتوي على نهايات أسطر CRLF (CRLF line terminators)، فإن ذلك يدعم التشخيص. وإذا أظهرت LF، فقد لا تكون نهايات الأسطر هي السبب. قد يختلف وصف أمر file على macOS، وقد لا يتم تلخيص النهايات المختلطة بوضوح، لذا استخدم رسالة الخطأ وسياق شفرة البرنامج النصي أيضًا. لفحص بايتات سطر معين، يشتمل macOS أيضًا على أداة od؛ على سبيل المثال:

od -An -tx1 -c "my script.sh" | head

يمثل التسلسل 0d 0a وجود CRLF؛ بينما يمثل 0a بمفرده LF. لا تتعامل مع حرف الرجوع إلى بداية السطر الموجود في مكان آخر بالملف كنهاية سطر دون التحقق من موضعه.

تحويل CRLF إلى LF دون الكتابة فوق الملف الأصلي

تشير إرشادات macOS من Apple إلى أن dos2unix غير مضمن في macOS، وتوصي باستخدام tr أو sed بدلاً من ذلك. بالنسبة لبرنامج نصي يستخدم CRLF، قم بإزالة أحرف الرجوع إلى بداية السطر وحفظ النتيجة في ملف منفصل، مع الاحتفاظ بالأصل كنسخة احتياطية:

cp -p "my script.sh" "my script.sh.bak"
tr -d '\r' < "my script.sh" > "my script.lf.sh"
file "my script.lf.sh"

هذا الإجراء مناسب عندما تكون أحرف الرجوع إلى بداية السطر غير المرغوب فيها هي أحرف نهايات أسطر Windows. يزيل هذا الأمر كل بايت CR في الملف، لذا تجنبه إذا كان الملف يستخدم أحرف الرجوع إلى بداية السطر عن قصد كبيانات. يؤدي الإخراج في ملف منفصل أيضًا إلى تجنب اقتطاع المدخلات: حيث إن إعادة التوجيه مباشرة إلى نفس الملف يمكن أن تؤدي إلى مسحه قبل انتهاء التحويل.

راجع الملف الجديد قبل استبدال أي شيء. إذا بدت المحتويات صحيحة وأفاد أمر file بوجود نهايات LF، فحاول تشغيله باستخدام المترجم المخصص له. بالنسبة لبرنامج نصي مكتوب لـ Bash، على سبيل المثال:

bash "my script.lf.sh"

تشغيله عبر bash لا يتطلب إذن التنفيذ (executable permission bit) أو سطر shebang صالح. إذا كنت بحاجة إلى تشغيله مباشرة كـ ./my script.lf.sh، فاجعله قابلاً للتنفيذ وتأكد من أن السطر الأول يحدد مفسرًا متاحًا، مثل #!/bin/bash:

chmod +x "my script.lf.sh"
"./my script.lf.sh"

بمجرد التحقق من الملف الذي تم إصلاحه، يمكنك استبدال الملف الأصلي في Finder أو Terminal. احتفظ بنسخة .bak حتى يعمل البرنامج النصي على النحو المنشود. إذا كان البرنامج النصي جزءًا من مشروع مشترك، فقم بإجراء تصحيح نهاية السطر نفسه في محرر الشفرة أو في سير عمل المستودع (repository workflow) حتى لا تتكرر المشكلة عند حفظ الملف مرة أخرى.

إذا استمر الخطأ

إذا أظهر أمر file وجود LF بالفعل، أو لم يؤدِ التحويل إلى إصلاح المشكلة، فاقرأ الخطأ بدقة وتحقق من المفسر المذكور في السطر الأول. يمكن أن يتسبب المفسر المفقود أو المسار غير الصالح أو خطأ في بناء الجملة (syntax error) أو عدم وجود إذن التنفيذ في حدوث مشكلات مماثلة. قد يعتمد البرنامج النصي أيضًا على أوامر أو ميزات shell غير متوفرة في المفسر الذي يحدده.

يمكن لـ TextEdit فتح مستندات النصوص العادية وحفظها، لكن دليل TextEdit الموثق من Apple لا يصف أداة لتحديد نهاية السطر. لإجراء هذا الإصلاح، استخدم طريقة التحويل عبر Terminal الموضحة أعلاه أو محرر شفرات يعرض نهايات الأسطر صراحة ويتيح لك تغييرها؛ ثم تحقق من الملف المحفوظ بعد ذلك. دليل TextEdit من Apple

التسلسل المفيد هو: تحديد تنسيق الملف، والاحتفاظ بنسخة احتياطية، والتحويل فقط عند وجود CRLF، وإعادة التشغيل باستخدام المفسر المطلوب. هذا يحافظ على حصر الإصلاح بالملف المعني بدلاً من تغيير برامج نصية أخرى غير ذات صلة.

المصادر