একটি অনুরূপ স্ক্রিপ্ট ছাড়া sudo
, তবে একই রকম ফলাফল:
$ cat script.sh
#!/bin/bash
sed -e 's/^/--/'
whoami
$ bash < script.sh
--whoami
$ dash < script.sh
itvirta
এর সাথে bash
, স্ক্রিপ্টের বাকী অংশটি ইনপুট হিসাবে যায় sed
, এর সাথে dash
, শেলটি এটি ব্যাখ্যা করে।
এগুলিতে চলছে strace
: dash
স্ক্রিপ্টের একটি ব্লক পড়ে (পুরো স্ক্রিপ্টটি ধরে রাখার চেয়ে এখানে আট কেবি), এবং তারপরে স্প্যান করে sed
:
read(0, "#!/bin/bash\nsed -e 's/^/--/'\nwho"..., 8192) = 36
stat("/bin/sed", {st_mode=S_IFREG|0755, st_size=73416, ...}) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|...
যার অর্থ ফাইলহ্যান্ডেলটি ফাইলের শেষে, এবং sed
কোনও ইনপুট দেখতে পাবে না। বাকি অংশের মধ্যে বাফার হচ্ছে dash
। (স্ক্রিপ্টটি যদি 8 কেবি ব্লকের আকারের চেয়ে দীর্ঘ হয়, তবে বাকী অংশটি পড়তে হবে sed
))
অন্যদিকে, বাশ শেষ কমান্ডের শেষের দিকে ফিরে যেতে চেয়েছিল:
read(0, "#!/bin/bash\nsed -e 's/^/--/'\nwho"..., 36) = 36
stat("/bin/sed", {st_mode=S_IFREG|0755, st_size=73416, ...}) = 0
...
lseek(0, -7, SEEK_CUR) = 29
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|...
যদি পাইপ থেকে ইনপুটটি এখানে আসে তবে:
$ cat script.sh | bash
রিপাইন্ডিং করা যায় না, যেহেতু পাইপ এবং সকেটগুলি অনুসন্ধানযোগ্য নয়। এই ক্ষেত্রে, বাশ পড়ার বিষয়টি এড়াতে একবারে একটি অক্ষর ইনপুট পড়তে ফিরে যায় । ( fd_to_buffered_stream()
ইনinput.c
) প্রতিটি বাইটের জন্য একটি সম্পূর্ণ সিস্টেম কল করা নীতিগতভাবে খুব কার্যকর নয়। অনুশীলনে, আমি মনে করি না যে পাঠাগুলি তুলনা করে একটি দুর্দান্ত ওভারহেড হবে যেমন শেলটি বেশিরভাগ ক্ষেত্রে পুরো নতুন প্রক্রিয়া তৈরি করে জড়িত।
অনুরূপ পরিস্থিতি হ'ল:
echo -e 'foo\nbar\ndoo' | bash -c 'read a; head -1'
সাব-শেলটি নিশ্চিত করতে হবে যে read
কেবল প্রথম নতুন head
লাইনটি পড়েছে, যাতে পরের লাইনটি দেখতে পায়। ( dash
এটিও এর সাথে কাজ করে ))
অন্য কথায়, বাশ একই উত্সটি স্ক্রিপ্টের জন্য এবং এটি থেকে সম্পাদিত আদেশগুলির জন্য সমর্থন করতে অতিরিক্ত দৈর্ঘ্যে যায়। dash
না। দ্য zsh
, এবং ksh93
প্যাকেজড ডাবিয়ান এই বিষয়ে বাশের সাথে যান।
sudo su
: unix.stackex