exec
লিনাক্স কার্নেল সিস্টেম কল shebangs বুঝতে পারে ( #!
) নেটিভ
আপনি যখন ব্যাশ করবেন:
./something
লিনাক্সে, exec
এটি পথের সাথে সিস্টেম কলকে কল করে ./something
।
কার্নেলের এই লাইনটি এই ফাইলটিতে পাঠানো হবে exec
: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
এটি ফাইলের প্রথম বাইটগুলি পড়ে এবং তাদের সাথে তুলনা করে #!
।
যদি তুলনাটি সত্য হয়, তবে বাকী রেখাটি লিনাক্স কার্নেল দ্বারা বিশ্লেষণ করা হয়েছে, যা প্রথম আর্গুমেন্ট হিসাবে exec
পাথ /usr/bin/env python
এবং বর্তমান ফাইলের সাথে আরেকটি কল করে :
/usr/bin/env python /path/to/script.py
এবং এটি এমন কোনও স্ক্রিপ্টিং ভাষার জন্য কাজ করে যা #
মন্তব্য চরিত্র হিসাবে ব্যবহার করে ।
এবং হ্যাঁ, আপনি এটি দিয়ে একটি অসীম লুপ তৈরি করতে পারেন:
printf '#!/a\n' | sudo tee /a
sudo chmod +x /a
/a
বাশ ত্রুটিটি সনাক্ত করে:
-bash: /a: /a: bad interpreter: Too many levels of symbolic links
#!
মানুষের পাঠযোগ্য হতে পারে, তবে এটির প্রয়োজন নেই।
যদি ফাইলটি বিভিন্ন বাইট দিয়ে শুরু হয়, তবে exec
সিস্টেম কলটি একটি ভিন্ন হ্যান্ডলার ব্যবহার করবে। অন্যান্য গুরুত্বপূর্ণ বিল্ট-ইন হ্যান্ডলারটি ইএলএফ এক্সিকিউটেবল ফাইলগুলির জন্য: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_elf.c#L1305 যা বাইটগুলি পরীক্ষা করে 7f 45 4c 46
(যা মানুষের মতো হয়ে ওঠে জন্য পঠনযোগ্য .ELF
)। আসুন নিশ্চিত করুন যে 4 টি প্রথম বাইট পড়ে /bin/ls
, যা একটি ELF এক্সিকিউটেবল:
head -c 4 "$(which ls)" | hd
আউটপুট:
00000000 7f 45 4c 46 |.ELF|
00000004
সুতরাং যখন কার্নেল সেগুলি বাইটগুলি দেখে, এটি ELF ফাইলটি নেয়, এটিকে সঠিকভাবে মেমরিতে রাখে এবং এটি দিয়ে একটি নতুন প্রক্রিয়া শুরু করে। আরও দেখুন: https://stackoverflow.com/questions/8352535/how-does-kernel-get-an-executable-binary-file-running-under-linux/31394861#31394861
অবশেষে, আপনি binfmt_misc
যান্ত্রিকতার সাথে নিজের শেবাং হ্যান্ডলার যুক্ত করতে পারেন । উদাহরণস্বরূপ, আপনি ফাইলগুলির জন্য.jar
একটি কাস্টম হ্যান্ডলার যুক্ত করতে পারেন । এই প্রক্রিয়াটি এমনকি ফাইল এক্সটেনশনের মাধ্যমে হ্যান্ডলারদের সমর্থন করে। আর একটি অ্যাপ্লিকেশন হ'ল কিউইএমইউ সহ স্বতন্ত্রভাবে একটি ভিন্ন স্থাপত্যের এক্সিকিউটেবলগুলি চালানো ।
আমি মনে করি না পসআইএক্স শেবাং সুনির্দিষ্ট করে বলেছে: https://unix.stackexchange.com/a/346214/32558 যদিও এটি যুক্তি বিভাগে এবং ফর্মটিতে "যদি এক্সিকিউটেবল স্ক্রিপ্টগুলি সিস্টেমের দ্বারা সমর্থিত হয় তবে" ঘটতে পারে".
chmod +x my_shell_script.sh ; /path/to/my_shell_script.sh # or ./my_shell_script.sh if you happen to be in its directory