যখন কোনও শেল স্ক্রিপ্ট শুরু হয় #!
, তখন প্রথম পংক্তিতে শেল সম্পর্কিত যতটা মন্তব্য হয়। তবে প্রথম দুটি অক্ষর সিস্টেমের অন্য একটি অংশে অর্থপূর্ণ: কার্নেল। দুটি চরিত্রকে শেবাং#!
বলা হয় । শেবাংয়ের ভূমিকা বুঝতে, আপনাকে বুঝতে হবে যে কোনও প্রোগ্রাম কীভাবে কার্যকর করা হয়।
একটি ফাইল থেকে একটি প্রোগ্রাম চালানোর জন্য কার্নেল থেকে কর্ম প্রয়োজন। এটি execve
সিস্টেম কলের অংশ হিসাবে করা হয় । কার্নেলটির কাছে ফাইল অনুমতিগুলি যাচাই করা, কলিং প্রক্রিয়ায় বর্তমানে চলমান এক্সিকিউটেবল ফাইলের সাথে সম্পর্কিত সংস্থানসমূহ (মেমরি ইত্যাদি) মুক্ত করতে হবে, নতুন এক্সিকিউটেবল ফাইলের জন্য সংস্থানগুলি বরাদ্দ করতে হবে এবং নতুন প্রোগ্রামে নিয়ন্ত্রণ স্থানান্তর করতে হবে (এবং আরও বেশি কিছু যা আমি উল্লেখ করব না)। execve
সিস্টেম কল বর্তমানে চলমান প্রক্রিয়ার কোড প্রতিস্থাপন; fork
একটি নতুন প্রক্রিয়া তৈরি করার জন্য একটি পৃথক সিস্টেম কল রয়েছে ।
এটি করার জন্য, কার্নেলকে এক্সিকিউটেবল ফাইলের ফর্ম্যাটটি সমর্থন করতে হবে। এই ফাইলটিতে মেশিন কোড থাকতে হবে, কার্নেল বুঝতে পারে এমনভাবে সংগঠিত। শেল স্ক্রিপ্টে মেশিন কোড থাকে না, সুতরাং এটি এভাবে চালানো যায় না।
শেবাং মেকানিজম কার্নেলটিকে অন্য প্রোগ্রামে কোডটি ব্যাখ্যা করার কাজটি পিছিয়ে দেওয়ার অনুমতি দেয়। যখন কার্নেল দেখেন যে এক্সিকিউটেবল ফাইলটি শুরু হয় #!
, তখন এটি পরবর্তী কয়েকটি অক্ষর পড়ে এবং ফাইলের প্রথম লাইনটি (বিয়োগী নেতৃস্থানীয় #!
এবং alচ্ছিক স্থান) অন্য ফাইলের পথ হিসাবে ব্যাখ্যা করে (যুক্তি যুক্তি, যা আমি এখানে আলোচনা করব না) )। যখন কার্নেলটিকে ফাইলটি নির্বাহ করতে বলা হয় /my/script
এবং ফাইলটি লাইন দিয়ে শুরু হয় #!/some/interpreter
তখন কার্নেলটি /some/interpreter
যুক্তি দিয়ে সঞ্চালিত করে /my/script
। এরপরে এটি /some/interpreter
সিদ্ধান্ত নেওয়া /my/script
উচিত যে এটি একটি স্ক্রিপ্ট ফাইল যা এটি কার্যকর করা উচিত।
কোনও ফাইলের মধ্যে কার্নেল বুঝতে পারে এমন কোনও ফর্ম্যাটে নেটিভ কোড না থাকলে এবং কোনও শেবাং দিয়ে শুরু না হলে কী হবে? ঠিক আছে, তাহলে ফাইলটি কার্যকরযোগ্য নয়, এবং execve
ত্রুটি কোড ENOEXEC
(এক্সিকিউটেবল ফর্ম্যাট ত্রুটি) এর সাথে সিস্টেম কল ব্যর্থ হয় ।
এটি গল্পের শেষ হতে পারে তবে বেশিরভাগ শেলগুলি ফ্যালব্যাক বৈশিষ্ট্যটি প্রয়োগ করে। যদি কার্নেলটি ফিরে আসে ENOEXEC
, শেলটি ফাইলের বিষয়বস্তুটি দেখে এবং এটি শেল স্ক্রিপ্টের মতো দেখায় কিনা তা পরীক্ষা করে। শেলটি যদি মনে করে যে ফাইলটি শেল স্ক্রিপ্টের মতো দেখাচ্ছে তবে এটি এটি নিজেই প্রয়োগ করে। এটি কীভাবে এটি করে তার বিশদটি শেলের উপর নির্ভর করে। আপনি ps $$
আপনার স্ক্রিপ্টে যোগ করে কিছু ঘটছে তা দেখতে পারবেন এবং strace -p1234 -f -eprocess
1234 শেলের পিআইডি যেখানে রয়েছে সেখানে প্রক্রিয়াটি দেখে আরও কিছু দেখতে পাবেন ।
ব্যাশে, এই ফলব্যাক প্রক্রিয়াটি কল করে প্রয়োগ করা হয় fork
তবে তা নয় execve
। চাইল্ড বাশ প্রক্রিয়াটি তার নিজের অভ্যন্তরীণ অবস্থাটি নিজেই পরিষ্কার করে এবং এটি চালানোর জন্য নতুন স্ক্রিপ্ট ফাইলটি খোলে। সুতরাং যে প্রক্রিয়াটি স্ক্রিপ্টটি চালায় সেগুলি এখনও মূল বাশ কোড চিত্র ব্যবহার করছে এবং আপনি যখন প্রাথমিকভাবে বাশকে ডাকলেন তখন মূল কমান্ড লাইন আর্গুমেন্টগুলি পাস হয়ে গেছে। এটিটি ksh একইভাবে আচরণ করে।
% bash --norc
bash-4.3$ ./foo.sh
PID TTY STAT TIME COMMAND
21913 pts/2 S+ 0:00 bash --norc
বিপরীতে, ড্যাশ আর্গুমেন্ট হিসাবে পাস করা স্ক্রিপ্টের পথটি ENOEXEC
কল করে প্রতিক্রিয়া জানায় /bin/sh
। অন্য কথায়, আপনি যখন ড্যাশ থেকে কোনও শেবাংলেস স্ক্রিপ্ট সম্পাদন করেন, তখন স্ক্রিপ্টটির সাথে শেবাং লাইন রয়েছে এমন আচরণ করে #!/bin/sh
। Mksh এবং zsh একইভাবে আচরণ করে।
% dash
$ ./foo.sh
PID TTY STAT TIME COMMAND
21427 pts/2 S+ 0:00 /bin/sh ./foo.sh