কোনও শেবাং পাওয়া কি সম্ভব যে কোনও দোভাষীর পাথ নির্দিষ্ট করার পরিবর্তে এটির অনুবাদকের নাম রয়েছে এবং শেলটি এটি $ PATH- এর মাধ্যমে খুঁজে পেতে দেয়?
যদি তা না হয়, তার কারণ আছে কি?
কোনও শেবাং পাওয়া কি সম্ভব যে কোনও দোভাষীর পাথ নির্দিষ্ট করার পরিবর্তে এটির অনুবাদকের নাম রয়েছে এবং শেলটি এটি $ PATH- এর মাধ্যমে খুঁজে পেতে দেয়?
যদি তা না হয়, তার কারণ আছে কি?
উত্তর:
PATH লুকোচুরি ইউজার স্পেসের স্ট্যান্ডার্ড সি লাইব্রেরির বৈশিষ্ট্য, যেমন সাধারণভাবে পরিবেশের পরিবর্তনশীল। কলার থেকে execve
নতুন প্রক্রিয়াতে পরিবেশের পাশ দিয়ে যাওয়া ছাড়া কার্নেলটি পরিবেশের পরিবর্তনগুলি দেখতে পাবে না ।
কার্নেলটি পথটিতে (এটি প্যাটার লুক করা execve
যেমন র্যাপার ফাংশনগুলির উপর নির্ভর করে execvp
) বা শেবাংয়ে (যা কমবেশি execve
অভ্যন্তরীণভাবে কলটিকে পুনরায় যাত্রা করে ) কোনও ব্যাখ্যা সম্পাদন করে না । সুতরাং আপনাকে শিবাঙ্গায় পরম পথ স্থাপন করা দরকার ¹ মূল কুঁড়েঘর বাস্তবায়ন শুধু একটি কোড কয়েক লাইন ছিল, এবং এটি উল্লেখযোগ্যভাবে যেহেতু না সম্প্রসারণ করা হয়েছে।
ইউনিক্সের প্রথম সংস্করণগুলিতে শেলটি নিজেই ডাকে কাজ করার কাজটি করল যখন আপনি যখন দেখলেন যে আপনি কোনও স্ক্রিপ্ট চালু করছেন inv শ্যাবাং বেশ কয়েকটি কারণে কর্নেলের সাথে যুক্ত হয়েছিল ( ডেনিস রিচি দ্বারা যুক্তির সংক্ষিপ্তসার :
পথবিহীন শেবাংগুলিকে হয় পরিবেশের ভেরিয়েবল এবং প্রক্রিয়া অ্যাক্সেস করার জন্য কার্নেলটি বাড়িয়ে তোলার প্রয়োজন হবে PATH
, বা কার্নেলটি একটি PATH চেহারা সম্পাদনকারী একটি ইউজারস্পেস প্রোগ্রাম কার্যকর করতে পারে। প্রথম পদ্ধতিটির জন্য কার্নেলের সাথে অপ্রাসঙ্গিক পরিমাণে জটিলতা যুক্ত করা দরকার। দ্বিতীয় পদ্ধতিটি ইতিমধ্যে একটি #!/usr/bin/env
শেবাং দিয়ে সম্ভব ।
You আপনি যদি কোনও আপেক্ষিক পথ রাখেন তবে এটি প্রক্রিয়াটির বর্তমান ডিরেক্টরিতে (স্ক্রিপ্টযুক্ত ডিরেক্টরি নয়) তুলনামূলকভাবে ব্যাখ্যা করা হয়, যা কোনও শেবাংয়ে খুব কমই কার্যকর।
execve
শ্যাবাংয়ে বা শ্যাবাংয়ে কার্নেলের কোনও নিখুঁত পথের প্রয়োজন নেই যদিও শেবাংয়ে এটি সম্পর্কিত কোনও আপত্তি নেই have
/lib64/ld-linux-x86-64.so.2
( ldd
আউটপুট দেখুন) are লিনাক্স এটি পুরোপুরি জেনেরিক করে তোলে: binfmt
সমর্থন (২.১.৪৩ থেকে) আপনাকে ইন্টারপ্রিটার-পাথ / ম্যাজিক-সংখ্যা-বা-ফাইল-এক্সটেনশান জোড়া নিবন্ধ করতে দেয়। আপনি PE32 থাকতে পারে .exe
গুলি ডাকা wine
যখন আপনি তাদের চালানোর জন্য, জাভা শ্রেণী এবং বয়াম ফাইল ডাকা java
ইত্যাদি ইত্যাদি
চোখের সাক্ষাতের চেয়ে আরও অনেক কিছু চলছে। #!
লাইনগুলি ইউনিক্স বা লিনাক্স কার্নেল দ্বারা ব্যাখ্যা করা হয়, #!
শাঁসের কোনও দিক নয়। এর অর্থ PATH
কার্নেল কোনটি কার্যকর করতে হবে তা স্থির করে এমন সময়ে সত্যই উপস্থিত নেই।
কোন এক্সিকিউটিভ চালানো হবে না জেনে বা perl
পোর্টেবল ফ্যাশনে বা অনুরূপ কল করার জন্য সর্বাধিক সাধারণ উপায় হ'ল ব্যবহার করা #!/usr/bin/env perl
। কার্নেল কার্যকর করে /usr/bin/env
, যা PATH
পরিবেশের পরিবর্তনশীল হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। env
(এই উদাহরণে) খুঁজে বের করে perl
এ PATH
ও ব্যবহার করে execve(2)
সিস্টেম কল চালানোর জন্য কার্নেল পেতে perl
এক্সিকিউটেবল।
$ strace sleep 1
execve("/usr/bin/sleep", ["sleep", "1"], [/* 99 vars */]) = 0
পুরো পথে রূপান্তরটি শেল (আরও সাধারণ: ব্যবহারকারীক্ষেত্রের) দ্বারা সম্পন্ন হয়। কার্নেলটি কোনও ফাইলের নাম / পাথের মাধ্যমে এটি সরাসরি অ্যাক্সেস করতে পারে exp
আপনি যদি PATH ভেরিয়েবলটি দেখে সিস্টেমটিকে আপনার নির্বাহযোগ্য হিসাবে সন্ধান করতে চান তবে আপনি নিজের শেবাংকে আবার লিখতে পারেন #!/usr/bin/env EXEC
।
তবে এই ক্ষেত্রে এটি অনুসন্ধানের কর্নেলও নয়।
strace
( /usr/bin/strace
কোনও কোনও সময়ে রূপান্তরিত )।