"এলএস" কার্যকর করার জন্য পৃথক প্রক্রিয়া কেন প্রয়োজন?


14

কেন lsএটি কার্যকর করার জন্য পৃথক প্রক্রিয়া প্রয়োজন? আমি জানি কেন কারণ কমান্ডগুলি cdকাঁটাচামচ প্রক্রিয়া দ্বারা মৃত্যুদন্ড কার্যকর করা যায় না তবে কাঁটাচামচ না করে কার্যকর করা হলে কোনও ক্ষতি আছে lsকি?


1
যদিও lsএটি একটি বাহ্যিক প্রোগ্রাম, echo *বা echo * .*(শেল বিকল্পের উপর নির্ভর করে) কাঁটাচামচ না করে ফাইল তালিকাভুক্ত করার জন্য বেশ ভাল কাজ করে।
অঙ্কিত

এটি আরও ভাল: প্রিন্টফ "% s \ n" *
কোস্টা

শেল বৈচিত্র নোট: tcsh একটি বিল্টিন রয়েছে ls-Fযা কাজ করে ls -F। এটি দক্ষতার জন্য আছে। আপনি সবসময় পাবেন -Fযা সাধারণত একটি ভাল ধারণা। আপনি যদি অন্য কোনও বিকল্প নির্দিষ্ট করে থাকেন তবে এটি বাহ্যিক কমান্ডে পাপ দেয়।

উত্তর:


18

উত্তরটি কম বেশি lsযা একটি বাহ্যিক নির্বাহযোগ্য। আপনি দৌড়ে এর অবস্থান দেখতে পাবেন type -p ls

lsতাহলে খোলের মধ্যে কেন নির্মিত হয়নি ? ভাল, এটা কেন করা উচিত? শেলের কাজ প্রতিটি উপলভ্য কমান্ডকে অন্তর্ভুক্ত করা নয়, তবে এগুলি চালনার পক্ষে সক্ষম পরিবেশ সরবরাহ করা। কিছু আধুনিক শেল রয়েছে echo, printfএবং বিল্টিন হিসাবে তাদের জাতীয়, যা প্রযুক্তিগতভাবে বিল্টিনগুলি তৈরি করতে হবে না, তবে তারা বারবার চালিত হলে (মূলত টাইট লুপগুলিতে) সঞ্চালনের কারণে তৈরি হয়। তাদের বিল্টিন না করে শেলটি তাদের প্রতিটি কলের জন্য কাঁটাচামচ করে একটি নতুন প্রক্রিয়া চালিত করতে পারে যা অত্যন্ত ধীর হতে পারে।

খুব কমপক্ষে, চলমান ls, একটি বহিরাগত এক্সিকিউটেবল, সিস্টেম কলগুলির একটি এক্সিকিউট পরিবার চালানো দরকার। আপনি কাঁটাচামচ না করে এটি করতে পারেন তবে এটি যে প্রাথমিক শেলটি আপনি ব্যবহার করছেন তা প্রতিস্থাপন করবে। নিম্নলিখিত কাজগুলি করে আপনি সেই পরিস্থিতিতে কী ঘটে তা দেখতে পারেন:

exec ls; echo "this never gets printed"

যেহেতু আপনার শেলের প্রক্রিয়া চিত্রটি প্রতিস্থাপন করা হয়েছে, বর্তমান শেল এটি করার পরে আর অ্যাক্সেসযোগ্য নয়। শেলের জন্য l চালানোর পরে চালিয়ে যেতে সক্ষম হতে কমান্ডটি শেলটি তৈরি করতে হবে।

ফোর্কিং এমন একটি প্রক্রিয়া প্রতিস্থাপনের অনুমতি দেয় যা আপনার প্রাথমিক শেল নয়, যার অর্থ আপনি পরে নিজের শেলটি চালিয়ে যেতে পারেন।


1
আমি মনে করি তিনি কেন জিজ্ঞাসা করছেন যে কেন এলএস (1) শেলের একটি অন্তর্নির্মিত বৈশিষ্ট্য নয়, যা কারও কাছে ব্যাখ্যা করতে হবে যে বিভিন্ন বিক্রেতাদের কীভাবে এলএস (1) এর জন্য বিভিন্ন বিকল্প রয়েছে এবং ফাইল সিস্টেম থেকে বিভিন্ন স্টাফ ইত্যাদি জিজ্ঞাসা করতে সক্ষম হবে ইত্যাদিও এবং উত্স, এবং বেশিরভাগ ডাউনটি শেলটি 'বিল্টিন' করে রাখার।
লুয়া

@llua আমি যে বিষয়ে কিছু তথ্য, এবং ছাড়া মামলা যোগ echo, printfইত্যাদি
ক্রিস নিচে

কিছু জিনিস কেন অন্তর্নির্মিত হয় এবং অন্যগুলি হয় না তা সবসময় পরিষ্কার হয় না। উদাহরণস্বরূপ, কেন cdকোনও বহিরাগত নির্বাহযোগ্য নয়?
ফাহিম মিঠা

@FaheemMitha আছে হয় একটি বহিস্থিত cdPOSIX-অনুবর্তী অপারেটিং সিস্টেমে এক্সিকিউটেবল ( এখানে দেখতে )। আপনি যদি বর্তমান প্রক্রিয়াতে আসলে chdir () করতে চান তবে আপনার এটি শেলটি তৈরি করা দরকার।
ক্রিস ডাউন

এটি lsবাহ্যিক কেন এটি একটি অভ্যাসে পরিণত হয়েছে , তবে এটি শেলও প্রয়োগ করা যেতে পারে। ব্যস্তবক্স দেখুন।

15

ব্যাশ রেফারেন্স ম্যানুয়াল পদ বলে:

বিল্টিন কমান্ডগুলি পৃথক ইউটিলিটিগুলি সহ কার্যকারিতা অসম্ভব বা অসুবিধার জন্য বাস্তবায়নের জন্য প্রয়োজনীয়।

এটি হ'ল শেলগুলি কেবল বিল্ট-ইন কমান্ড অন্তর্ভুক্ত করার জন্য ডিজাইন করা হয়েছে যদি:

  1. POSIX মান দ্বারা প্রয়োজনীয়
  2. যে কমান্ডগুলির শেল নিজেই অ্যাক্সেসের প্রয়োজন, যেমন জব নিয়ন্ত্রণ বিল্ট-ইনগুলি
  3. কমান্ডগুলি যা খুব সহজ, ওএস নির্ভর করে না এবং প্রিন্টফের মতো বিল্ট-ইন হিসাবে প্রয়োগ করার সময় কার্যকরকরণের দক্ষতা বাড়ায়

lsকমান্ড উপরে requirments কোন মাপসই করা হবে না।

তবে , এখানে কোনও প্রোগ্রামিং সীমাবদ্ধতা নেই যা lsকোনও অন্তর্নির্মিত হিসাবে জড়িত হওয়া আটকাবে না, যা ব্যাশ ইন্টারপ্রেটারের মতো একই প্রক্রিয়াতে কার্যকর হয়। কমান্ডগুলির নকশার কারণগুলি শেল বিল্ট-ইনগুলি হিসাবে জড়িত না হওয়ার কারণগুলি হ'ল:

  1. শেলটি ফাইল সিস্টেমের থেকে পৃথক হওয়া উচিত - কোনও বিল্ট-ইন কমান্ড কোনও ফাইল সিস্টেম বা পেরিফেরিয়াল ডিভাইসের সঠিক ক্রিয়াকলাপের উপর নির্ভর করে না
  2. ফাইল-সিস্টেম টাইপ বা ওএস নির্ভর হতে পারে এমন একটি কমান্ড পৃথক নির্বাহযোগ্য হতে হবে
  3. আপনি যে কমান্ডটি পাইপ করতে চাইতে পারেন সেগুলি আলাদা প্রক্রিয়া হওয়া উচিত
  4. আপনি যে কমান্ডটি পটভূমিতে চালাতে চাইতে পারেন তা পৃথক নির্বাহযোগ্য হতে হবে
  5. সম্ভাব্য প্যারামিটারগুলির একটি বৃহত সংখ্যা রয়েছে এমন একটি কমান্ড একটি পৃথক নির্বাহযোগ্যতে আরও ভালভাবে প্রয়োগ করা হয়
  6. যে ধরণের শেল (ব্যাশ, সিএসএস, টিশ, ...) নির্ধারণ করে তাদের একা নির্বাহযোগ্য হতে হবে সেগুলি নির্বিশেষে যে কমান্ডগুলির একই আউটপুট হওয়া উচিত

প্রথম কারণ সম্পর্কে - আপনি শেলটি যতটা সম্ভব স্বাধীন এবং নমনীয় হতে চান। আপনি শেলটি এমন lsকোনও এনএফএস মাউন্টটির আটকে না যেতে চান যা "এখনও চেষ্টা করে সাড়া দিচ্ছে না"।

দ্বিতীয় কারণ সম্পর্কে - অনেক ক্ষেত্রে আপনি ব্যস্তবক্স বা অন্যান্য ফাইল সিস্টেম ব্যবহার করে এমন একটি সিস্টেমের জন্য একটি শেল ব্যবহার করতে চাইতে পারেন যা একটি পৃথক lsবাস্তবায়ন করে। অথবা এমনকি ওএস এর একই শেল উত্স ব্যবহার করুন যার বিভিন্ন lsপ্রয়োগ রয়েছে।

তৃতীয় কারণ সম্পর্কে - যেমন মত প্রকাশের জন্য শেল দোভাষী হিসাবে একই প্রক্রিয়াতে find . -type d | xargs ls -ladবাস্তবায়ন করা কঠিন বা অসম্ভব হবে ls

চতুর্থ কারণ সম্পর্কে - কিছু lsকমান্ড সম্পূর্ণ হতে দীর্ঘ সময় নিতে পারে। এর মধ্যে আপনি শেলটি অন্য কোনও কাজ চালিয়ে যেতে চাইতে পারেন।


দ্রষ্টব্য: দেখুন এই সহায়ক পোস্টে দ্বারা ওয়ারেন ইয়াং একটি অনুরূপ প্রশ্নের জবাবে।


আপনি যদি পাইপিং আউটপুটটির স্বাচ্ছন্দ্যটি হারিয়ে ফেলেন তবে এটির একটি পৃথক কমান্ড, এবং সমস্ত প্রোগ্রামিং এটি একটি শেল আদিমকে পৃথক এক্সিকিউটেবলের মধ্যে পাইপ করতে হবে।
ব্রুস এডিগার

@ ব্রুসইডিগার: সম্মানিত বিই এর কাছ থেকে একটি মন্তব্য পেয়ে কি আনন্দ হয়। ধন্যবাদ! আমি বিশ্বাস করি যে কারণ 3 আপনার মন্তব্য কভার, না?
জোনাথন বেন-অভ্রাহাম

1
আমি বাহ্যিক প্রক্রিয়াগুলির জন্য পাইপগুলি হ্যান্ডেল করতে এবং বহিরাগত প্রক্রিয়ার মধ্যে অনুমানের মতো অভ্যন্তরীণ কমান্ডের আউটপুটটি পাইপ করতে হলে শেলের নিজেই উত্স কোডটি কতটা জটিল হবে তার প্রান্তে আমি আরও ভাবছিলাম ls। এটি করা যেতে পারে, তবে এটি জটিল হবে।
ব্রুস এডিগার

1
আপনার 5 পয়েন্টের সবগুলি মিট না থাকলে আমি সবচেয়ে বেশি ভয় পাই afraid 1: ls ফাইল সিস্টেম বাস্তবায়ন থেকে স্বাধীন (আশাবাদী) স্বাধীন। এটি স্ট্যান্ডার্ড লাইব্রেরি এবং অ্যাপ্লিকেশনগুলিকে একটি সামঞ্জস্যপূর্ণ ইন্টারফেস সরবরাহ করতে কার্নেলের উপর নির্ভর করে। 2: ls সম্ভবত শেলের চেয়ে ওএসের সাথে কম নির্ভরশীল। 3: শেলগুলি অবশ্যই পাইপলাইনে বিল্টিনগুলিকে মঞ্জুরি দেয়। 4: শেলগুলি অবশ্যই পটভূমিতে বিল্টিনগুলি চালানোর অনুমতি দেয়। 5: এটি যথেষ্ট বিষয়গত।
jlliagre

1
@ জোনাথনবেন-অভ্রাহাম @ ব্রুস এডিগার শেলগুলি কি সাবসেলের সাথে বিল্টিনগুলির জন্য পাইপ কেস ইতিমধ্যে পরিচালনা করে না? যেমন bashআউটপুট alias | grep ls। ইনপুটcat /etc/passwd | while read a; do echo "$a"; done
ম্যাট

2

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একই ধরণের ফাংশন পরিবেশন করতে পারে।


2

আমি মনে করি যে এখানে কিছু লোক মিস করছে তা হ'ল 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পূর্ণ গনুহ সংস্করণ হিসাবে বৈশিষ্ট্যযুক্ত হিসাবে bash10% এক্সিকিউটেবল আকার বৃদ্ধি করবে। এটি পুরো dashশেল হিসাবে প্রায় একই আকার !

বেশিরভাগ শেল বিল্টিনগুলি বেছে নেওয়া হয় কারণ তারা শেলের সাথে এমনভাবে সংহত করে যেভাবে বহিরাগত এক্সিকিউটেবলগুলি (প্রশ্নটি নির্দেশ করে না cd, তবে অন্য উদাহরণটি killবাশ কাজ নিয়ন্ত্রণের সাথে একীকরণের বাশ সংস্করণ ) বা কারণ এগুলি প্রয়োগ করার জন্য খুব সহজ কমান্ড, একটি বিশাল গতি বনাম আকার পেওফ দেওয়া ( trueএবং falseএটি যতটা সহজ হয় তার প্রায় সহজ)।

জিএনইউর lsএকটি দীর্ঘ বিকাশ চক্র ছিল এবং প্রয়োগগুলি কী / কীভাবে ফলাফল প্রদর্শিত হবে তা কাস্টমাইজ করার বিকল্পগুলি পারে। ডিফল্টরূপে বিল্টিন এলএস ব্যবহার করা হয় এই কার্যকারিতাটি হারাবে বা শেলের জটিলতা এবং আকার উল্লেখযোগ্যভাবে বৃদ্ধি করবে।


1

cdশেলের মধ্যে নির্মিত, lsএটি একটি পৃথক প্রোগ্রাম যা আপনি দেখতে পাবেন /bin/ls


0

আপনি যা সন্ধান করছেন এটি এটি করুন:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.