কেন ls
এটি কার্যকর করার জন্য পৃথক প্রক্রিয়া প্রয়োজন? আমি জানি কেন কারণ কমান্ডগুলি cd
কাঁটাচামচ প্রক্রিয়া দ্বারা মৃত্যুদন্ড কার্যকর করা যায় না তবে কাঁটাচামচ না করে কার্যকর করা হলে কোনও ক্ষতি আছে ls
কি?
কেন ls
এটি কার্যকর করার জন্য পৃথক প্রক্রিয়া প্রয়োজন? আমি জানি কেন কারণ কমান্ডগুলি cd
কাঁটাচামচ প্রক্রিয়া দ্বারা মৃত্যুদন্ড কার্যকর করা যায় না তবে কাঁটাচামচ না করে কার্যকর করা হলে কোনও ক্ষতি আছে ls
কি?
উত্তর:
উত্তরটি কম বেশি ls
যা একটি বাহ্যিক নির্বাহযোগ্য। আপনি দৌড়ে এর অবস্থান দেখতে পাবেন type -p ls
।
ls
তাহলে খোলের মধ্যে কেন নির্মিত হয়নি ? ভাল, এটা কেন করা উচিত? শেলের কাজ প্রতিটি উপলভ্য কমান্ডকে অন্তর্ভুক্ত করা নয়, তবে এগুলি চালনার পক্ষে সক্ষম পরিবেশ সরবরাহ করা। কিছু আধুনিক শেল রয়েছে echo
, printf
এবং বিল্টিন হিসাবে তাদের জাতীয়, যা প্রযুক্তিগতভাবে বিল্টিনগুলি তৈরি করতে হবে না, তবে তারা বারবার চালিত হলে (মূলত টাইট লুপগুলিতে) সঞ্চালনের কারণে তৈরি হয়। তাদের বিল্টিন না করে শেলটি তাদের প্রতিটি কলের জন্য কাঁটাচামচ করে একটি নতুন প্রক্রিয়া চালিত করতে পারে যা অত্যন্ত ধীর হতে পারে।
খুব কমপক্ষে, চলমান ls
, একটি বহিরাগত এক্সিকিউটেবল, সিস্টেম কলগুলির একটি এক্সিকিউট পরিবার চালানো দরকার। আপনি কাঁটাচামচ না করে এটি করতে পারেন তবে এটি যে প্রাথমিক শেলটি আপনি ব্যবহার করছেন তা প্রতিস্থাপন করবে। নিম্নলিখিত কাজগুলি করে আপনি সেই পরিস্থিতিতে কী ঘটে তা দেখতে পারেন:
exec ls; echo "this never gets printed"
যেহেতু আপনার শেলের প্রক্রিয়া চিত্রটি প্রতিস্থাপন করা হয়েছে, বর্তমান শেল এটি করার পরে আর অ্যাক্সেসযোগ্য নয়। শেলের জন্য l চালানোর পরে চালিয়ে যেতে সক্ষম হতে কমান্ডটি শেলটি তৈরি করতে হবে।
ফোর্কিং এমন একটি প্রক্রিয়া প্রতিস্থাপনের অনুমতি দেয় যা আপনার প্রাথমিক শেল নয়, যার অর্থ আপনি পরে নিজের শেলটি চালিয়ে যেতে পারেন।
echo
, printf
ইত্যাদি
cd
কোনও বহিরাগত নির্বাহযোগ্য নয়?
cd
POSIX-অনুবর্তী অপারেটিং সিস্টেমে এক্সিকিউটেবল ( এখানে দেখতে )। আপনি যদি বর্তমান প্রক্রিয়াতে আসলে chdir () করতে চান তবে আপনার এটি শেলটি তৈরি করা দরকার।
ব্যাশ রেফারেন্স ম্যানুয়াল পদ বলে:
বিল্টিন কমান্ডগুলি পৃথক ইউটিলিটিগুলি সহ কার্যকারিতা অসম্ভব বা অসুবিধার জন্য বাস্তবায়নের জন্য প্রয়োজনীয়।
এটি হ'ল শেলগুলি কেবল বিল্ট-ইন কমান্ড অন্তর্ভুক্ত করার জন্য ডিজাইন করা হয়েছে যদি:
ls
কমান্ড উপরে requirments কোন মাপসই করা হবে না।
তবে , এখানে কোনও প্রোগ্রামিং সীমাবদ্ধতা নেই যা ls
কোনও অন্তর্নির্মিত হিসাবে জড়িত হওয়া আটকাবে না, যা ব্যাশ ইন্টারপ্রেটারের মতো একই প্রক্রিয়াতে কার্যকর হয়। কমান্ডগুলির নকশার কারণগুলি শেল বিল্ট-ইনগুলি হিসাবে জড়িত না হওয়ার কারণগুলি হ'ল:
প্রথম কারণ সম্পর্কে - আপনি শেলটি যতটা সম্ভব স্বাধীন এবং নমনীয় হতে চান। আপনি শেলটি এমন ls
কোনও এনএফএস মাউন্টটির আটকে না যেতে চান যা "এখনও চেষ্টা করে সাড়া দিচ্ছে না"।
দ্বিতীয় কারণ সম্পর্কে - অনেক ক্ষেত্রে আপনি ব্যস্তবক্স বা অন্যান্য ফাইল সিস্টেম ব্যবহার করে এমন একটি সিস্টেমের জন্য একটি শেল ব্যবহার করতে চাইতে পারেন যা একটি পৃথক ls
বাস্তবায়ন করে। অথবা এমনকি ওএস এর একই শেল উত্স ব্যবহার করুন যার বিভিন্ন ls
প্রয়োগ রয়েছে।
তৃতীয় কারণ সম্পর্কে - যেমন মত প্রকাশের জন্য শেল দোভাষী হিসাবে একই প্রক্রিয়াতে find . -type d | xargs ls -lad
বাস্তবায়ন করা কঠিন বা অসম্ভব হবে ls
।
চতুর্থ কারণ সম্পর্কে - কিছু ls
কমান্ড সম্পূর্ণ হতে দীর্ঘ সময় নিতে পারে। এর মধ্যে আপনি শেলটি অন্য কোনও কাজ চালিয়ে যেতে চাইতে পারেন।
দ্রষ্টব্য: দেখুন এই সহায়ক পোস্টে দ্বারা ওয়ারেন ইয়াং একটি অনুরূপ প্রশ্নের জবাবে।
ls
। এটি করা যেতে পারে, তবে এটি জটিল হবে।
bash
আউটপুট alias | grep ls
। ইনপুটcat /etc/passwd | while read a; do echo "$a"; done
ls
পৃথক প্রক্রিয়া প্রয়োজন হয় না। খুব কম কমান্ডের জন্য একটি পৃথক প্রক্রিয়া প্রয়োজন: বিশেষাধিকার পরিবর্তন করার প্রয়োজন কেবলমাত্র।
একটি নিয়ম হিসাবে, শেলগুলি বিল্টিন হিসাবে কমান্ডগুলি কেবল তখনই প্রয়োগ করে যখন সেই আদেশগুলি বিল্টইন হিসাবে প্রয়োগ করতে হবে। কমান্ড মত alias
, cd
, exit
, export
, jobs
, ... পড়া বা শেলের কিছু অভ্যন্তরীণ স্থিতি পরিবর্তন করতে, সেইজন্য এবং প্রয়োজন না পৃথক কর্মসূচি হতে পারে না। যে কমান্ডগুলির যেমন কোনও প্রয়োজনীয়তা নেই সেগুলি পৃথক আদেশ হতে পারে; এইভাবে, যে কোনও শেল বা অন্যান্য প্রোগ্রাম থেকে তাদের কল করা যেতে পারে।
ব্যাশের বিল্টিনগুলির তালিকার দিকে তাকানো, কেবলমাত্র নিম্নলিখিত বিল্টিনগুলি পৃথক কমান্ড হিসাবে প্রয়োগ করা যেতে পারে। তাদের কারও কারও জন্য কার্যকারিতার সামান্য ক্ষতি হবে।
command
- তবে এটি এমন পরিস্থিতিতে তার কার্যকারিতা হারাবে যেখানে PATH
সঠিকভাবে সেট আপ না করা যেতে পারে এবং স্ক্রিপ্টটি সেট আপ করার command
অংশ হিসাবে ব্যবহার করছে।echo
- এটি দক্ষতার জন্য অন্তর্নির্মিত।help
- এটি একটি পৃথক ডাটাবেস ব্যবহার করতে পারে, তবে শেল এক্সিকিউটেবলের সাহায্যের পাঠ্য এম্বেড করার ফলে শেলকে নির্বাহযোগ্যকে স্বয়ংসম্পূর্ণ করার সুবিধা রয়েছে।kill
- একটি বিল্টিন থাকার দুটি সুবিধা রয়েছে: এটি আইডি প্রসেসের পাশাপাশি চাকরীর উপকরণগুলিও চিনতে পারে এবং আলাদা প্রক্রিয়া শুরু করার জন্য পর্যাপ্ত সংস্থান না থাকলেও এটি ব্যবহার করা যেতে পারে।printf
- একই কারণে echo
এবং -v
আউটপুটটিকে একটি ভেরিয়েবলের মধ্যে রাখার বিকল্পটিকে সমর্থন করার জন্য।pwd
- বিল্টিনটি লজিকাল বর্তমান ডিরেক্টরি ট্র্যাকিংয়ের অতিরিক্ত সক্ষমতা সরবরাহ করে (প্রতীকী লিঙ্কগুলি প্রসারিত করার পরিবর্তে অক্ষত রেখে দেওয়া)।test
- এটি দক্ষতার জন্য একটি অন্তর্নির্মিত (এবং বাশ /dev/fd/…
কিছু অপারেটিং সিস্টেমে ডাকা ফাইলগুলির সাথে কিছু জাদুও করে )।কয়েকটি শেল উল্লেখযোগ্য সংখ্যক অতিরিক্ত বিল্টিন সরবরাহ করে। সেখানে সাশ রয়েছে , যা জরুরি মেরামত করার জন্য স্ট্যান্ডলোন বাইনারি হিসাবে নকশাকৃত একটি শেল (যখন কিছু বাহ্যিক আদেশগুলি ব্যবহারযোগ্য নাও হতে পারে)। এটা একটা বিল্ট-ইন করেছেন ls
, বলা -ls
, সেইসাথে যেমন অন্যান্য সরঞ্জাম -grep
এবং -tar
। সাশের বিল্টিনগুলিতে পূর্ণ কমান্ডের চেয়ে কম ক্ষমতা রয়েছে। Zsh এর zsh / ফাইল মডিউলে কিছু অনুরূপ বিল্টিন সরবরাহ করে । এটিতে নেই ls
, তবে ওয়াইল্ডকার্ড সম্প্রসারণ ( echo *
) এবং zstat
একই ধরণের ফাংশন পরিবেশন করতে পারে।
আমি মনে করি যে এখানে কিছু লোক মিস করছে তা হ'ল ls
লিনাক্সে জিএনইউ প্রোগ্রামের শিয়ার জটিলতা । সম্পাদনযোগ্যতা আকার তুলনা ls
করতে bash
এবং dash
আমার ডেবিয়ান সিস্টেমে শাঁস, আমরা দেখতে যে এটা বেশ বড়:
graeme@graeme:~$ ls -lh /bin/{ls,bash,dash}
-rwxr-xr-x 1 root root 953K Mar 30 2013 /bin/bash
-rwxr-xr-x 1 root root 115K Dec 25 20:25 /bin/dash
-rwxr-xr-x 1 root root 108K Jul 20 22:52 /bin/ls
একটি সহ ls
পূর্ণ গনুহ সংস্করণ হিসাবে বৈশিষ্ট্যযুক্ত হিসাবে bash
10% এক্সিকিউটেবল আকার বৃদ্ধি করবে। এটি পুরো dash
শেল হিসাবে প্রায় একই আকার !
বেশিরভাগ শেল বিল্টিনগুলি বেছে নেওয়া হয় কারণ তারা শেলের সাথে এমনভাবে সংহত করে যেভাবে বহিরাগত এক্সিকিউটেবলগুলি (প্রশ্নটি নির্দেশ করে না cd
, তবে অন্য উদাহরণটি kill
বাশ কাজ নিয়ন্ত্রণের সাথে একীকরণের বাশ সংস্করণ ) বা কারণ এগুলি প্রয়োগ করার জন্য খুব সহজ কমান্ড, একটি বিশাল গতি বনাম আকার পেওফ দেওয়া ( true
এবং false
এটি যতটা সহজ হয় তার প্রায় সহজ)।
জিএনইউর ls
একটি দীর্ঘ বিকাশ চক্র ছিল এবং প্রয়োগগুলি কী / কীভাবে ফলাফল প্রদর্শিত হবে তা কাস্টমাইজ করার বিকল্পগুলি পারে। ডিফল্টরূপে বিল্টিন এলএস ব্যবহার করা হয় এই কার্যকারিতাটি হারাবে বা শেলের জটিলতা এবং আকার উল্লেখযোগ্যভাবে বৃদ্ধি করবে।
আপনি যা সন্ধান করছেন এটি এটি করুন:
printf "%s\n" *
এছাড়াও আপনি অ্যারে ফাইলের নাম সংরক্ষণ করতে পারেন:
files=(`printf "%s\n" *`) #items are separated by whitespace
echo ${#files[*]} files
for index in ${!a[*]}
do printf "%d: %s\n" $index ${a[$index]};
done
তবে এটি নামগুলিতে ফাঁকা স্থানগুলির বিষয়ে চিন্তা করে না এটি
ভেরিয়েবলের দিকে যায় এবং স্পেসগুলি যত্ন করে:
printf "%s\n" * | while read a; do echo $a; done
ls
এটি একটি বাহ্যিক প্রোগ্রাম,echo *
বাecho * .*
(শেল বিকল্পের উপর নির্ভর করে) কাঁটাচামচ না করে ফাইল তালিকাভুক্ত করার জন্য বেশ ভাল কাজ করে।