একটি লোকাল শেল স্ক্রিপ্ট চালানোর সময় macOS Terminal যদি “permission denied” দেখায়, তবে প্রথমে নিশ্চিত করুন যে আপনি সঠিক ফোল্ডারে আছেন এবং ফাইলটি পড়তে পারছেন। তারপর এটি সরাসরি চালানোর ইচ্ছা থাকলে chmod u+x দিয়ে আপনার ব্যবহারকারীর জন্য execute পারমিশন যোগ করুন। এতেও যদি ত্রুটির সমাধান না হয়, তবে ধারণকারী ফোল্ডারগুলো পরীক্ষা করুন এবং macOS শেল চালু করা অ্যাপটিকে ফাইল অ্যাক্সেস করতে বাধা দিচ্ছে কি না তা দেখুন। প্রাথমিক সমাধান হিসেবে sudo ব্যবহার করা বা ব্যাপকভাবে পারমিশন পরিবর্তন করা এড়িয়ে চলুন।

১. স্ক্রিপ্টের পাথ এবং আপনার বর্তমান ফোল্ডার নিশ্চিত করুন

Terminal খুলুন এবং স্ক্রিপ্টটি যে ফোল্ডারে আছে সেখানে যান। পাথে স্পেস থাকলে তা কোটেশনের মধ্যে রাখুন:

cd "/Users/yourname/Projects/My Scripts"
ls -l "./build.sh"

উদাহরণস্বরূপ দেওয়া পাথ এবং ফাইলের নামটি আপনার নিজস্ব তথ্য দিয়ে প্রতিস্থাপন করুন। ls -l-এর আউটপুট ফাইলের পারমিশন এবং মালিক প্রদর্শন করে। ফাইলটি খুঁজে পাওয়া যাচ্ছে না বলা হলে, সঠিক ফোল্ডারটি সনাক্ত করুন অথবা পুরো পাথটি ব্যবহার করুন। ./build.sh-এর মতো একটি রিলেটিভ পাথের অর্থ হলো “বর্তমান ফোল্ডারে থাকা build.sh”; এটি অন্য কোনো ফোল্ডারে অনুসন্ধান করে না।

২. আপনার স্ক্রিপ্টে execute পারমিশন যোগ করুন

ফাইলটি বিদ্যমান থাকলে এবং আপনি এটির মালিক হলে, শুধুমাত্র আপনার অ্যাকাউন্টের জন্য execute পারমিশন যোগ করুন, তারপর এর ফোল্ডার থেকে এটি চালান:

chmod u+x "./build.sh"
./build.sh

অ্যাপলের শেল স্ক্রিপ্টিং নির্দেশিকায় স্ক্রিপ্ট চালানোর আগে chmod u+x ব্যবহার করার কথা বলা হয়েছে। u অক্ষরটি পরিবর্তনটিকে কেবল ফাইলের মালিকের মধ্যে সীমাবদ্ধ রাখে; +x চালানোর অনুমতি (execute permission) যোগ করে। এটি chmod 777-এর চেয়ে অনেক বেশি নিয়ন্ত্রিত, যা সবাইকে পড়া, লেখা এবং চালানোর অনুমতি দেয়। Apple-এর Shell Script Basics

Terminal-এ যদি এখনও “permission denied” দেখায়, তবে ls -l দিয়ে আবার পারমিশনগুলো পরীক্ষা করুন। ফাইলের মালিক কে তা জানতে ls -l এবং আপনার অ্যাকাউন্টের নাম জানতে whoami ব্যবহার করতে পারেন। অন্য কোনো অ্যাকাউন্ট যদি স্ক্রিপ্টটির মালিক হয় এবং এটি পরিবর্তন করার পারমিশন আপনার না থাকে, তবে আপনার মালিকানাধীন কোনো ফোল্ডারে এটির একটি কপি ব্যবহার করুন অথবা মালিক বা অ্যাডমিনিস্ট্রেটরের কাছে প্রয়োজনীয় অ্যাক্সেস চান। শর্টকাট হিসেবে সিস্টেম ফাইলগুলোর মালিকানা নিজের নামে নেবেন না।

৩. ফোল্ডার অ্যাক্সেস এবং স্ক্রিপ্টের বিষয়বস্তু পরীক্ষা করুন

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

স্ক্রিপ্টটি কোনো আউটপুট ফাইল তৈরি বা পরিবর্তন করার চেষ্টা করার সময় যদি আপনার কমান্ডটি Permission denied দেখায়, তবে স্ক্রিপ্টটি হয়তো রান করার উপযোগী (executable), কিন্তু সেই গন্তব্যে লেখার অ্যাক্সেস (write access) নেই। গন্তব্য ফোল্ডার এবং স্ক্রিপ্টের পাথটি পরীক্ষা করুন। কেবল একটি ত্রুটি এড়ানোর জন্য স্ক্রিপ্টটিকে সবার জন্য পরিবর্তনযোগ্য বা এক্সিকিউটেবল করবেন না।

Desktop, Documents বা Downloads-এর ভিতরের কোনো স্ক্রিপ্টের ক্ষেত্রে, Terminal ছাড়া অন্য কোনো অ্যাপ যখন এটি চালু করে তখন macOS গোপনীয়তা নিয়ন্ত্রণগুলোও গুরুত্বপূর্ণ হতে পারে। System Settings-এ গিয়ে Privacy & Security > Files & Folders খুলুন এবং সংশ্লিষ্ট অ্যাপটির জন্য তালিকাভুক্ত অ্যাক্সেস পর্যালোচনা করুন। অ্যাপল এই নিয়ন্ত্রণগুলোকে নির্দিষ্ট লোকেশনে অ্যাপ-ভিত্তিক অ্যাক্সেস হিসেবে বর্ণনা করে। শেল কমান্ড থেকে আসা পারমিশন সংক্রান্ত ত্রুটি নিজেই প্রমাণ করে না যে এই গোপনীয়তা সেটিংটিই এর কারণ। Apple: Mac-এ ফাইল এবং ফোল্ডারে অ্যাক্সেস নিয়ন্ত্রণ করুন

৪. সরাসরি চালানো ব্যর্থ হলে, ইন্টারপ্রেটার স্পষ্টভাবে চালান

একটি স্ক্রিপ্ট আপনার অ্যাকাউন্ট দিয়ে পড়ার যোগ্য হলেও execute পারমিশনের অভাব থাকতে পারে। এটি যদি একটি শেল স্ক্রিপ্ট হয়, তবে আপনি এর ইন্টারপ্রেটারকে সরাসরি এটি পড়তে এবং চালাতে বলতে পারেন:

/bin/sh "./build.sh"

স্ক্রিপ্টটি sh-এর জন্য তৈরি হলেই কেবল এটি ব্যবহার করুন। এর প্রথম লাইনে যদি অন্য কোনো ইন্টারপ্রেটারের নাম থাকে, যেমন Bash, তবে এর পরিবর্তে সেই ইন্টারপ্রেটার ব্যবহার করুন; ইন্টারপ্রেটার লাইনটি (#! লাইন) নির্দিষ্ট করে যে স্ক্রিপ্টটি কীভাবে চলার কথা। ধারাবাহিকতা বজায় রাখতে অ্যাপল এই লাইনটি অন্তর্ভুক্ত করার পরামর্শ দেয়। Apple-এর Shell Script Basics

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

৫. শর্টকাট হিসেবে sudo ব্যবহার করবেন না বা নিরাপত্তা সুরক্ষা নিষ্ক্রিয় করবেন না

sudo উচ্চতর সুবিধাসহ (elevated privileges) একটি কমান্ড চালায়; এটি হারিয়ে যাওয়া ফাইল, ভুল পাথ বা আপনার পরীক্ষা না করা কোনো স্ক্রিপ্টের সমাধান করে না। কাজটি কেন অ্যাডমিনিস্ট্রেটর অ্যাক্সেসের দাবি করে তা যখন আপনি বোঝেন এবং স্ক্রিপ্টের উৎস ও বিষয়বস্তু বিশ্বাস করেন, কেবল তখনই এটি ব্যবহার করুন। chmod 777-এর মতো ব্যাপক পরিবর্তন ফাইলগুলোকে অন্য ব্যবহারকারীদের দ্বারা পরিবর্তনের ঝুঁকিতে ফেলতে পারে।

একটি শেল স্ক্রিপ্টের “permission denied” বার্তাটি macOS যাচাই করতে পারে না এমন কোনো অ্যাপ সম্পর্কে Gatekeeper-এর সতর্কবার্তা থেকেও আলাদা। অ্যাপলের নথিবদ্ধ “Open Anyway” পদক্ষেপগুলো কোনো অ্যাপ সতর্কতার ক্ষেত্রে প্রযোজ্য এবং অ্যাপটি নির্ভরযোগ্য কি না তা নিশ্চিত হতে হয়; শেল ফাইল পারমিশনের জন্য এগুলো সাধারণ কোনো সমাধান নয়। Apple: আপনার Mac-এ নিরাপদে অ্যাপ খুলুন

দ্রুত রোগনির্ণয়

  • অবিলম্বে ./script.sh: permission denied দেখালে: ফাইলের execute পারমিশন পরীক্ষা করুন; আপনি যদি এর মালিক হন এবং এটি বিশ্বাস করেন, তবে chmod u+x "./script.sh" দিয়ে চেষ্টা করুন।
  • ফাইলটি খুঁজে পাওয়া না গেলে: আপনার বর্তমান ফোল্ডার এবং ফাইলের সঠিক নামটি যাচাই করুন।
  • স্ক্রিপ্ট শুরু হওয়ার পর কোনো কমান্ড বাধাগ্রস্ত হলে: সেই কমান্ডটি নির্দিষ্ট কোন ফাইল বা ফোল্ডার অ্যাক্সেস করার চেষ্টা করছে তা পরীক্ষা করুন।
  • অ্যাপ সতর্কতায় ডেভেলপারকে যাচাই করা যাচ্ছে না বললে: অ্যাপটির উৎস যাচাই করার পরেই কেবল অ্যাপলের অ্যাপ-সুরক্ষা নির্দেশিকা অনুসরণ করুন; সেই সতর্কতাটি শেলের execute পারমিশন থেকে আলাদা।

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

উৎসসমূহ