উইন্ডোজ থেকে কপি করা কোনো স্ক্রিপ্ট দেখতে স্বাভাবিক হলেও যদি ম্যাকওএস "bad interpreter" রিপোর্ট করে বা কমান্ডগুলোতে অতিরিক্ত অক্ষর আছে এমন আচরণ করে, তবে উইন্ডোজের CRLF লাইন এন্ডিং আছে কিনা তা পরীক্ষা করে দেখুন। ম্যাকওএস কমান্ড-লাইন টুলগুলো LF প্রত্যাশা করে। আপনি ফাইলের ধরন নিশ্চিত করতে পারেন, ম্যাকওএসে থাকা বিল্ট-ইন টুলগুলো ব্যবহার করে একটি কপি রূপান্তর করতে পারেন এবং তারপর মেরামত করা স্ক্রিপ্টটি পুনরায় রান করতে পারেন।

ম্যাকওএসে লাইন এন্ডিং কেন একটি স্ক্রিপ্টকে অকেজো করে দেয়

লাইন এন্ডিং হলো একটি ক্যারেক্টার (বা একজোড়া ক্যারেক্টার) যা কোনো টেক্সট লাইনের সমাপ্তি নির্দেশ করে। ম্যাকওএস কমান্ড-লাইন টুলগুলো LF (\n) ব্যবহার করে; উইন্ডোজ সাধারণত CRLF (\r\n) ব্যবহার করে। CRLF-এর ক্ষেত্রে, কোনো ইউনিক্স কমান্ড যখন লাইনটি পড়ে, তখন ক্যারেজ রিটার্নটি লাইনের সাথে যুক্ত থেকে যেতে পারে। অ্যাপলের নথিপত্রে উল্লেখ রয়েছে যে, এই অতিরিক্ত ক্যারেক্টারটি কমান্ড-লাইন টুল এবং স্ক্রিপ্টগুলোতে অনাকাঙ্ক্ষিত আচরণের কারণ হতে পারে। অ্যাপলের শেল-স্ক্রিপ্টিং গাইড

সাধারণ লক্ষণগুলোর মধ্যে রয়েছে /bin/bash^M: bad interpreter, কোনো command-not-found বার্তা যাতে শেষে একটি \r যুক্ত আছে বলে মনে হয়, অথবা দৃশ্যমান স্ক্রিপ্টটি সঠিক হওয়া সত্ত্বেও পার্সিং ব্যর্থ হওয়া। এই লক্ষণগুলোর অন্যান্য কারণও থাকতে পারে; ফাইলটি পরীক্ষা করা একটি দরকারী প্রাথমিক পদক্ষেপ, তবে এটি নিজেই চূড়ান্ত প্রমাণ নয়।

স্ক্রিপ্টের লাইন-এন্ডিং ফরম্যাট পরীক্ষা করুন

টার্মিনাল খুলুন, স্ক্রিপ্টটি যে ফোল্ডারে আছে সেখানে যান এবং file দিয়ে এটি পরীক্ষা করুন। ফাইলের নামটি কোটেশনের মধ্যে রাখুন যাতে স্পেস এবং শেল মেটাক্যারেক্টারগুলো আক্ষরিক অর্থে বিবেচিত হয়:

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

আউটপুটে যদি বলা হয় যে ফাইলটিতে CRLF লাইন টার্মিনেটর রয়েছে, তবে তা সমস্যার কারণ নিশ্চিত করে। যদি এটি LF রিপোর্ট করে, তবে লাইন এন্ডিং হয়তো সমস্যার কারণ নয়। ম্যাকওএসের file কমান্ডের বিবরণ ভিন্ন হতে পারে, এবং মিশ্রিত লাইন এন্ডিংগুলো স্পষ্টভাবে সংক্ষিপ্ত নাও হতে পারে, তাই ত্রুটির বার্তা এবং স্ক্রিপ্টের মূল প্রেক্ষাপটও বিবেচনা করুন। নির্দিষ্ট লাইনের বাইটগুলো পরীক্ষা করতে, ম্যাকওএসে od-ও অন্তর্ভুক্ত রয়েছে; উদাহরণস্বরূপ:

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

একটি 0d 0a সিকোয়েন্স CRLF নির্দেশ করে; শুধুমাত্র 0a হলো LF। অবস্থান পরীক্ষা না করে ফাইলের অন্যত্র থাকা কোনো ক্যারেজ রিটার্নকে লাইন এন্ডিং হিসেবে বিবেচনা করবেন না।

মূল ফাইলটি ওভাররাইট না করে CRLF-কে LF-এ রূপান্তর করুন

অ্যাপলের ম্যাকওএস সংক্রান্ত নির্দেশিকায় উল্লেখ করা হয়েছে যে dos2unix ম্যাকওএসে অন্তর্ভুক্ত নয় এবং এর পরিবর্তে 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"

অনাকাঙ্ক্ষিত ক্যারেজ রিটার্নগুলো উইন্ডোজ লাইন-এন্ডিং ক্যারেক্টার হলে এটি উপযুক্ত উপায়। এটি ফাইলের প্রতিটি CR বাইট সরিয়ে ফেলে, তাই ফাইলটিতে যদি ডেটা হিসেবে ইচ্ছাকৃতভাবে ক্যারেজ রিটার্ন ব্যবহার করা হয়ে থাকে তবে এটি পরিহার করুন। পৃথক আউটপুট ফাইল ব্যবহার ইনপুট ট্রাঙ্কেট হওয়াও রোধ করে: সরাসরি একই ফাইলে রিডাইরেক্ট করলে রূপান্তর শেষ হওয়ার আগেই ফাইলটি মুছে যেতে পারে।

কোনো কিছু প্রতিস্থাপন করার আগে নতুন ফাইলটি পর্যালোচনা করুন। বিষয়বস্তু সঠিক মনে হলে এবং file কমান্ড LF এন্ডিং রিপোর্ট করলে, নির্ধারিত ইন্টারপ্রেটার দিয়ে এটি রান করার চেষ্টা করুন। উদাহরণস্বরূপ, একটি ব্যাশ স্ক্রিপ্টের জন্য:

bash "my script.lf.sh"

bash-এর মাধ্যমে এটি রান করার জন্য এক্সিকিউটেবল পারমিশন বিট বা কার্যকরী শিবাং-এর প্রয়োজন নেই। যদি আপনাকে এটি সরাসরি ./my script.lf.sh হিসেবে রান করতে হয়, তবে এটিকে এক্সিকিউটেবল করুন এবং নিশ্চিত করুন যে এর প্রথম লাইনে একটি উপলব্ধ ইন্টারপ্রেটারের নাম রয়েছে, যেমন #!/bin/bash:

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

মেরামত করা ফাইলটি যাচাই করার পর, আপনি ফাইন্ডার বা টার্মিনালে মূল ফাইলটি প্রতিস্থাপন করতে পারেন। স্ক্রিপ্টটি সঠিকভাবে কাজ না করা পর্যন্ত .bak কপিটি রেখে দিন। স্ক্রিপ্টটি কোনো শেয়ার্ড প্রোজেক্টের অংশ হলে, এর সোর্স এডিটর বা রিপোজিটরি ওয়ার্কফ্লোতেও একই লাইন-এন্ডিং সংশোধন করুন যাতে ফাইলটি পুনরায় সেভ করার সময় সমস্যার পুনরাবৃত্তি না ঘটে।

ত্রুটিটি যদি থেকেই যায়

যদি file কমান্ড আগেই LF দেখিয়ে থাকে, অথবা রূপান্তরের পরেও সমস্যাটি সমাধান না হয়, তবে সঠিক ত্রুটিটি পড়ুন এবং প্রথম লাইনে উল্লেখিত ইন্টারপ্রেটারটি পরীক্ষা করুন। অনুপস্থিত ইন্টারপ্রেটার, ভুল পাথ, সিনট্যাক্স ত্রুটি, বা এক্সিকিউট পারমিশনের অভাব একই ধরনের ত্রুটি তৈরি করতে পারে। স্ক্রিপ্টটি এমন কোনো কমান্ড বা শেল ফিচারের ওপরও নির্ভর করতে পারে যা তার নির্ধারিত ইন্টারপ্রেটারে উপলব্ধ নেই।

টেক্সটএডিট প্লেইন-টেক্সট ডকুমেন্ট খুলতে এবং সেভ করতে পারে, তবে অ্যাপলের টেক্সটএডিট গাইডে লাইন-এন্ডিং নির্বাচকের কোনো উল্লেখ নেই। এই মেরামতের জন্য, উপরের টার্মিনাল রূপান্তর পদ্ধতিটি ব্যবহার করুন অথবা এমন একটি কোড এডিটর ব্যবহার করুন যা স্পষ্টভাবে লাইন এন্ডিং প্রদর্শন করে এবং পরিবর্তন করতে দেয়; পরবর্তীতে সেভ করা ফাইলটি যাচাই করে নিন। অ্যাপলের টেক্সটএডিট গাইড

সঠিক কাজের ধাপ হলো: ফাইলের ফরম্যাট শনাক্ত করুন, একটি ব্যাকআপ সংরক্ষণ করুন, কেবল CRLF উপস্থিত থাকলেই রূপান্তর করুন, এবং নির্ধারিত ইন্টারপ্রেটার ব্যবহার করে পুনরায় রান করুন। এটি অন্যান্য স্ক্রিপ্ট পরিবর্তন না করে নির্দিষ্ট ফাইলের সমাধান নিশ্চিত করে।

সূত্র