यदि Windows से कॉपी की गई कोई स्क्रिप्ट सामान्य दिखती है, लेकिन macOS “bad interpreter” रिपोर्ट करता है या ऐसा व्यवहार करता है जैसे कमांड्स में कोई अतिरिक्त वर्ण (कैरेक्टर) है, तो Windows CRLF लाइन एंडिंग्स की जांच करें। macOS कमांड-लाइन टूल्स LF की अपेक्षा करते हैं। आप फ़ाइल प्रकार की पुष्टि कर सकते हैं, macOS पर पहले से मौजूद टूल्स के साथ एक कॉपी को कन्वर्ट कर सकते हैं, और फिर ठीक की गई स्क्रिप्ट को फिर से चला सकते हैं।

macOS पर लाइन एंडिंग्स स्क्रिप्ट को क्यों बाधित करती हैं

लाइन एंडिंग एक वर्ण (या वर्णों का जोड़ा) होता है जो किसी टेक्स्ट लाइन के अंत को चिह्नित करता है। macOS कमांड-लाइन टूल्स LF (\n) का उपयोग करते हैं; Windows आमतौर पर CRLF (\r\n) का उपयोग करता है। CRLF के साथ, जब कोई Unix कमांड इसे पढ़ता है तो कैरिज रिटर्न (carriage return) लाइन से जुड़ा रह सकता है। Apple के दस्तावेज़ बताते हैं कि यह अतिरिक्त वर्ण कमांड-लाइन टूल्स और स्क्रिप्ट्स में अप्रत्याशित व्यवहार का कारण बन सकता है। Apple की शेल-स्क्रिप्टिंग गाइड

सामान्य संकेतों में /bin/bash^M: bad interpreter, कमांड-नॉट-फाउंड संदेश जिसमें अंत में \r शामिल दिखाई देता है, या पार्सिंग का विफल होना शामिल है भले ही दिखाई देने वाली स्क्रिप्ट सही दिख रही हो। इन लक्षणों के अन्य कारण भी हो सकते हैं; फ़ाइल की जांच करना एक उपयोगी पहला कदम है, अपने आप में कोई अंतिम प्रमाण नहीं।

स्क्रिप्ट के लाइन-एंडिंग फ़ॉर्मेट की जांच करें

Terminal खोलें, उस फ़ोल्डर में जाएं जिसमें स्क्रिप्ट मौजूद है, और file के साथ इसका निरीक्षण करें। फ़ाइल नाम को कोट्स (quotes) में रखें ताकि स्पेस और शेल मेटाकैरेक्टर को सामान्य टेक्स्ट माना जाए:

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

यदि आउटपुट में कहा जाता है कि फ़ाइल में CRLF लाइन टर्मिनेटर हैं, तो यह इस समस्या की पुष्टि करता है। यदि यह LF रिपोर्ट करता है, तो हो सकता है कि लाइन एंडिंग्स इसका कारण न हों। macOS file कमांड का विवरण भिन्न हो सकता है, और मिश्रित एंडिंग्स को स्पष्ट रूप से संक्षेपित नहीं किया जा सकता है, इसलिए त्रुटि संदेश और स्क्रिप्ट के सोर्स संदर्भ का भी उपयोग करें। किसी विशिष्ट लाइन के बाइट्स का निरीक्षण करने के लिए, macOS में od भी शामिल है; उदाहरण के लिए:

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

एक 0d 0a क्रम CRLF को दर्शाता है; केवल 0a LF है। फ़ाइल में कहीं और मौजूद कैरिज रिटर्न को उसकी स्थिति की जांच किए बिना लाइन एंडिंग न मानें।

ओरिजिनल फ़ाइल को ओवरराइट किए बिना CRLF को LF में बदलें

Apple का macOS मार्गदर्शन यह उल्लेख करता है कि 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 के ज़रिए चलाने के लिए निष्पादन योग्य अनुमति (एग्जीक्यूटेबल परमिशन बिट) या काम करने वाले शीबैंग (shebang) की आवश्यकता नहीं होती है। यदि आपको इसे सीधे ./my script.lf.sh के रूप में चलाने की आवश्यकता है, तो इसे निष्पादन योग्य (executable) बनाएं और सुनिश्चित करें कि इसकी पहली पंक्ति में उपलब्ध इंटरप्रेटर का नाम हो, जैसे कि #!/bin/bash:

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

एक बार जब आप ठीक की गई फ़ाइल की जांच कर लेते हैं, तो आप Finder या Terminal में मूल फ़ाइल को बदल सकते हैं। .bak कॉपी तब तक रखें जब तक कि स्क्रिप्ट इच्छानुसार काम न करने लगे। यदि स्क्रिप्ट किसी शेयर्ड प्रोजेक्ट का हिस्सा है, तो उसके सोर्स एडिटर या रिपॉजिटरी वर्कफ़्लो में वही लाइन-एंडिंग सुधार करें ताकि फ़ाइल को दोबारा सहेजने (save करने) पर समस्या वापस न आए।

यदि त्रुटि बनी रहती है

यदि file ने पहले ही LF दिखाया था, या कन्वर्ज़न से समस्या ठीक नहीं हुई, तो सटीक त्रुटि पढ़ें और पहली पंक्ति में नामित इंटरप्रेटर की जांच करें। अनुपलब्ध इंटरप्रेटर, अमान्य पथ (invalid path), सिंटैक्स त्रुटि, या निष्पादित करने की अनुमति की कमी इसी तरह की विफलताएं उत्पन्न कर सकती हैं। स्क्रिप्ट उन कमांड्स या शेल सुविधाओं पर भी निर्भर हो सकती है जो उसके द्वारा निर्दिष्ट इंटरप्रेटर में अनुपलब्ध हैं।

TextEdit प्लेन-टेक्स्ट दस्तावेज़ों को खोल और सहेज सकता है, लेकिन Apple की प्रलेखित TextEdit गाइड में लाइन-एंडिंग चयनकर्ता (selector) का वर्णन नहीं है। इस सुधार के लिए, ऊपर बताए गए Terminal कन्वर्ज़न या ऐसे कोड एडिटर का उपयोग करें जो स्पष्ट रूप से लाइन एंडिंग्स दिखाता है और आपको उन्हें बदलने देता है; बाद में सहेजी गई फ़ाइल को सत्यापित करें। Apple की TextEdit गाइड

उपयोगी क्रम यह है: फ़ाइल के फ़ॉर्मेट की पहचान करें, एक बैकअप सुरक्षित रखें, केवल तभी बदलें जब CRLF मौजूद हो, और इच्छित इंटरप्रेटर का उपयोग करके फिर से चलाएं। यह समाधान को असंबद्ध स्क्रिप्ट्स को बदले बिना केवल उसी विशिष्ट फ़ाइल तक सीमित रखता है।

स्रोत