উত্তর:
অন্যরা যেমন বলেছে, আপনি এটি করতে পারবেন না।
তবে আপনি যদি কোডটি একটি ফাইলে সাজিয়ে রাখতে চান যাতে মূল প্রোগ্রামটি ফাইলের শীর্ষে থাকে এবং অন্যান্য ফাংশনগুলি নীচে সংজ্ঞায়িত করা হয় তবে আপনি আলাদা mainফাংশন করে এটি করতে পারেন ।
যেমন
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
আমরা যখন mainফাইলের শেষে কল করি তখন সমস্ত ফাংশন ইতিমধ্যে সংজ্ঞায়িত হয়। ফাংশনে দৃশ্যমানভাবে স্ক্রিপ্টের কমান্ড লাইন আর্গুমেন্টগুলি তৈরি করার জন্য স্পষ্টভাবে প্রেরণ "$@"করা mainপ্রয়োজন।
exitকলকে মুখ্য হিসাবে একই লাইনে সুস্পষ্ট হওয়া বাধ্যতামূলক নয়, তবে স্ক্রিপ্ট ফাইলটি সংশোধন করা হলে চলমান স্ক্রিপ্টটি গণ্ডগোল থেকে বাঁচাতে ব্যবহার করা যেতে পারে। এটি ছাড়া, শেলটি স্ক্রিপ্ট ফাইল থেকে mainরিটার্নের পরে কমান্ডগুলি পড়া চালিয়ে যাওয়ার চেষ্টা করবে । (দেখুন পুরো শেল স্ক্রিপ্টটি কার্যকর করার আগে কীভাবে পড়বেন? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"মূল ফাংশনটি কল করতে ব্যবহার করি যাতে আমি এটি Mainসম্পাদন না করেই অন্য স্ক্রিপ্টে উত্স করতে পারি । তারপরে আমি হয় ফাংশনগুলি পুনরায় ব্যবহার করতে পারি বা সেগুলি পরীক্ষা করে পরীক্ষা লিখতে পারি।
main "$@"; exit(সঙ্গে exitযেমন একই লাইনে main) হিসাবে ফাইল বিরুদ্ধে রক্ষাকবচ যখন এটি ব্যাখ্যা করা হয় পরিবর্তিত হচ্ছে এছাড়াও দরকারী।
exitএকই লাইনে mainরাখি যেহেতু আমরা নিশ্চিত করে ফেলি যে শেলটি ফাইলের পরে আর কিছু পড়বে না main।
main; exit, main; exit $?বা main <EOF>সমস্ত ক্ষেত্রেই mainস্ক্রিপ্টের প্রস্থান কোড হিসাবে প্রস্থান কোড ব্যবহার করা হয়। exitকেউ স্ক্রিপ্ট যখন এটি চালাচ্ছে সম্পাদনাগুলি যদি শুধু জিনিষ আপ তছনছ পেয়ে প্রতিরোধ করা হবে।
না, ফাংশনগুলি তাদের কল করার সময় শাঁস পরিবেশে বিদ্যমান থাকতে হবে।
গুগলের "শেল স্টাইল গাইড" এর এটির একটি সমাধান রয়েছে:
mainকমপক্ষে অন্য একটি ফাংশন ধারণ করার জন্য স্ক্রিপ্টগুলির জন্য দীর্ঘস্থায়ী একটি ফাংশন প্রয়োজন।
স্ক্রিপ্টের একেবারে শেষে, সমস্ত ক্রিয়াকলাপের পরে, কোনও ফাংশন নয়, কেবলমাত্র বিবৃতি হিসাবে
main "$@"
এটি mainস্ক্রিপ্টটি যা পরামিতি দিয়েছিল তা দিয়ে ফাংশনটিকে কল করবে । mainফাংশন স্ক্রিপ্ট শীর্ষে অবস্থিত যেতে পারে (শৈলী গাইড নীচে এটা করা বলছে, কিন্তু তারপর আবার, এটা অনেক কিছু বলেছেন)।
শেলটি mainকল এলে, স্ক্রিপ্টের সমস্ত ফাংশন পার্স করা হয়েছে এবং তাই mainফাংশনটির মধ্যে থেকে কল করা যেতে পারে।
না, ফাংশনগুলি ব্যবহারের আগে তাদের ঘোষণা করতে হবে। শেল স্ক্রিপ্টগুলি এক এক করে লাইনে পঠিত হয় এবং লাইনে লাইনে অভিনয় করা হয়; সুতরাং কোনও ঘোষণা কার্যকর না হওয়া পর্যন্ত কোনও ফাংশন বিদ্যমান থাকে না।
Cএটা আরামদায়ক নয়।
. yourfile)।
ifকাছে কোনও ফাংশনের বাইরে খালি বিবৃতি নেই। ফাংশন সংজ্ঞায়িত করা যখন আপনি নেই ডিক্লেয়ারif -containing ফাংশন ঠিক যখন আপনি কল করুন।
শেলটির কোনও declaringফাংশনের ধারণা নেই । সুতরাং আপনার কোনও অগ্রণী ঘোষণা থাকতে পারে না।
ফলস্বরূপ, ফাংশন বাস্তবায়ন শেলটি কল করার আগে এটি পড়া উচিত।
autoload fফাংশনটি ঘোষণা করে তবে এর দেহটি কেবল প্রথম অনুরোধের পরে বোঝাই হয়)। এটি bashযদিও ওপির ক্ষেত্রে প্রযোজ্য নয় ।