একটি বিল্টিন কমান্ড এবং যেটি নয় তার মধ্যে পার্থক্য কী?


72

বিল্টিন কমান্ড এবং অন্য কমান্ডের মধ্যে কোনও স্বতন্ত্র পার্থক্য রয়েছে যা নামমাত্র একই জিনিসটি করতে পারে?

যেমন। বিল্টিনগুলি কি "বিশেষ" ট্র্যাটিমেট পান? ... ওভারহেড কি কম চলছে? .. বা এগুলি কেবল কেবল 'অন্তর্নির্মিত'; আপনার গাড়ির ড্যাশবোর্ডের মতো?

... এবং এই বিল্টিনগুলির একটি নির্দিষ্ট (বর্তমান) তালিকা রয়েছে?

উত্তর:


90

আপনার মন্তব্যগুলি থেকে, শেলটি ঠিক কী তা সম্পর্কে আপনি বিভ্রান্ত বলে মনে হচ্ছে। কার্নেলটি সিস্টেম পরিচালনার জন্য দায়বদ্ধ। এটি সেই অংশ যা প্রকৃতপক্ষে প্রোগ্রাম লোড করে এবং চালায়, ফাইলগুলি অ্যাক্সেস করে, মেমরি বরাদ্দ করে ইত্যাদি etc. তবে কার্নেলের কোনও ব্যবহারকারী ইন্টারফেস নেই; আপনি কেবলমাত্র মধ্যস্থতাকারী হিসাবে অন্য প্রোগ্রাম ব্যবহার করে এটির সাথে যোগাযোগ করতে পারেন।

শেল একটি প্রোগ্রাম যা প্রম্পট মুদ্রণ করে, আপনার কাছ থেকে ইনপুট একটি লাইন পড়ে, এবং তারপরে ফাইলগুলিকে ম্যানিপুলেট করতে বা অন্যান্য প্রোগ্রামগুলি চালনার জন্য এক বা একাধিক আদেশ হিসাবে ব্যাখ্যা করে। জিইউআই আবিষ্কারের আগে শেলটি কোনও ওএসের প্রাথমিক ব্যবহারকারী ইন্টারফেস ছিল। এমএস-ডস-এ, শেলটি কল করা হয়েছিল command.comএবং খুব কম লোকই কখনও আলাদা ব্যবহার করার চেষ্টা করেছিল। ইউনিক্সে, যদিও বহু আগে থেকেই একাধিক শেল ব্যবহারকারীরা নিতে পারত।

এগুলি 3 ধরণের মধ্যে ভাগ করা যায়। বোর্ন-সামঞ্জস্যপূর্ণ শেলগুলি মূল বোর্ন শেল থেকে প্রাপ্ত সিনট্যাক্স ব্যবহার করে । সি শেলগুলি মূল সি শেল থেকে সিনট্যাক্স ব্যবহার করে । তারপরে এমন অনিয়ন্ত্রিত শাঁস রয়েছে যা তাদের নিজস্ব বাক্য গঠন আবিষ্কার করে, বা কোনও প্রোগ্রামিং ভাষা থেকে একটি ধার করে, এবং সাধারণত প্রথম দুটি ধরণের তুলনায় খুব কম জনপ্রিয় হয়।

বিল্ট-ইন কমান্ড হ'ল একটি কমান্ড যা শেল নিজেই বহন করে, অন্য কোনও প্রোগ্রাম লোড ও চালানোর অনুরোধ হিসাবে ব্যাখ্যা করার পরিবর্তে। এটির দুটি প্রধান প্রভাব রয়েছে। প্রথমত, এটি সাধারণত দ্রুত হয়, কারণ কোনও প্রোগ্রাম লোড এবং চালাতে সময় লাগে। অবশ্যই, কমান্ডটি চালাতে যত বেশি সময় নেয়, সামগ্রিক রান সময়ের সাথে তুলনামূলকভাবে লোডের সময় কম তাত্পর্যপূর্ণ হয় (কারণ লোডের সময়টি মোটামুটি ধ্রুবক হয়)।

দ্বিতীয়ত, একটি অন্তর্নির্মিত কমান্ড শেলের অভ্যন্তরীণ অবস্থাকে প্রভাবিত করতে পারে। এ কারণেই কমান্ডগুলি cd অবশ্যই অন্তর্নির্মিত হতে হবে , কারণ কোনও বহিরাগত প্রোগ্রাম শেলের বর্তমান ডিরেক্টরি পরিবর্তন করতে পারে না। অন্যান্য কমান্ডগুলি যেমন echoদক্ষতার জন্য অন্তর্নির্মিত হতে পারে তবে এটি বাহ্যিক আদেশ হতে পারে না এমন কোনও অভ্যন্তরীণ কারণ নেই।

কোন কমান্ডগুলি অন্তর্নির্মিত তা আপনি যে শেলটি ব্যবহার করছেন তার উপর নির্ভর করে। আপনাকে কোনও লিস্টের জন্য এটির ডকুমেন্টেশনগুলির সাথে পরামর্শ করতে হবে (উদাহরণস্বরূপ, bashবিল্ট-ইন কমান্ডগুলি এর ম্যানুয়ালটির ৪ র্থ অধ্যায়ে তালিকাভুক্ত )। typeযদি কমান্ড বিল্ট-ইন (যদি আপনার শেল POSIX সামঞ্জস্যপূর্ণ) হয় কমান্ড আপনি বলতে পারেন, কারণ POSIX যে প্রয়োজন typeএকটি বিল্ট-ইন করা আবশ্যক। যদি whichআপনার শেলটিতে অন্তর্নির্মিত না হয়, তবে এটি সম্ভবত আপনার শেলের বিল্ট-ইনগুলি সম্পর্কে জানতে পারে না, তবে কেবল বাহ্যিক প্রোগ্রামগুলি সন্ধান করবে।


অ্যাপ্লিকেশনগুলি প্রকৃতপক্ষে বিঘ্ন প্রকাশ করে কার্নেলের সাথে যোগাযোগ করে।
নাথান ওসমান

11
@ জর্জি: অ্যাপ্লিকেশনগুলি সিস্কল জারি করে কার্নেলের সাথে যোগাযোগ করে, যা ওএস এবং আর্কিটেকচারের উপর নির্ভর করে বাধা ব্যবহার করতে পারে বা নাও পারে। ব্যবহারকারীরা, একটি নিয়ম হিসাবে, বাধা প্রদান করবেন না।
গিলস

2
@ সিজেএম: আপনি যখন এটিকে এটি ব্যাখ্যা করেন তখন এটি খুব সহজ শোনায়:) ... আপনি অবশ্যই কুয়াশা পরিষ্কার করতে সাহায্য করেছেন ... এখন একটি হালকা কুয়াশা .. (প্রকৃতপক্ষে ঠিক আজকের আবহাওয়ার মতোই, আজ সকালে। .. pleasantly, কুয়াশাচ্ছন্ন;) ... ধন্যবাদ
Peter.O

@ গিলস: সত্যি? আমি ভেবেছিলাম যে সমস্ত ব্যবহারকারীর মোড প্রোগ্রামগুলি কার্নেলের সাথে বাধা (কিছু নির্দিষ্ট আর্কিটেকচারের মাধ্যমে) মাধ্যমে যোগাযোগ করেছে।
নাথান ওসমান

2
@ সিজেএম খুব সুন্দর এবং শিক্ষামূলক উত্তর। আমি এটি পড়া অনেক শিখেছি। :)
ankush981

37

বিল্ট-ইন ইউটিলিটিগুলির তিনটি স্তর রয়েছে:

  • কিছু ইউটিলিটিগুলি সংরক্ষিত শব্দ না হওয়া সত্ত্বেও প্রোগ্রামিং ভাষা হিসাবে সত্যই শেলের একটি অংশ । তারা নিয়ন্ত্রণ প্রবাহ ইউটিলিটি (হয় ., :, break, continue, return, trap, exit, exec, eval), পরামিতি সংক্রান্ত ইউটিলিটি ( set, unset, shift, export, readonly, local¹, typeset¹), ওরফে ইউটিলিটি ( alias² এর, unalias² এর) এবং times³। এই বিশেষ বিল্ট-ইনগুলি বিশেষ চিকিত্সা পান:

    • যদি আপনি কোনও বিশেষ অন্তর্নির্মিতকে ভুল যুক্তিগুলি পাস করেন তবে ত্রুটি বার্তা প্রদর্শন করার পরে কেবল পরবর্তী কমান্ডে এড়িয়ে চলার পরিবর্তে শেল নিজেই বাতিল হয়ে যেতে পারে।
    • প্রাক-অ্যাসাইনমেন্ট সিনট্যাক্সটির foo=bar utilityআলাদা অর্থ রয়েছে: এটি foo=bar; utilityকেবলমাত্র ইউটিলিটির সময়কালের জন্য পরিবেশকে বরাদ্দ না করে একটি সাধারণ প্যারামিটার অ্যাসাইনমেন্ট (অর্থাত্ সমমান )।
  • কিছু ইউটিলিটি শেলের অভ্যন্তরে প্রয়োগ করা দরকার কারণ তারা শেলের অভ্যন্তরীণ সেটিংসে কাজ করে। এটা অন্তর্ভুক্ত:

    • ইউটিলিটি যে যেমন শেল বর্তমান ডিরেক্টরির কাজ cd, dirs, pushd, popd;
    • যেমন কাজ নিয়ন্ত্রণ ইউটিলিটি bg, disown, fg, jobs, wait;
    • ইউটিলিটি পড়তে বা এই ধরনের অন্যান্য শেল বৈশিষ্ট্যাবলী নিপূণভাবে builtin, command, hash, read, type, ulimit, umask;
    • যেমন ইন্টারেক্টিভ বৈশিষ্ট্য, যখন তারা উপস্থিত হন, এর সাথে সম্পর্কিত ইউটিলিটি fc, history, bind
  • কিছু ইউটিলিটি সাধারণত বিশুদ্ধরূপে জন্য নির্মিত-ইনগুলি হিসাবে প্রয়োগ করা হয় কর্মক্ষমতা : echo, printf, test, true, false

বাশ , ksh এবং zsh এর মতো উন্নত শেলগুলিতে সাধারণত আরও অন্তর্নির্মিত থাকে, প্রায়শই অ-মানক বৈশিষ্ট্যগুলি প্রয়োগ করা হয় (সাধারণত ইন্টারঅ্যাকশনের জন্য)। প্রতিটি শেলের ম্যানুয়াল আপনাকে কী কমান্ডগুলি অন্তর্নির্মিত তা বলে দেবে, যদিও কিছু শেল ( zsh , কমপক্ষে) গতিশীল-লোডযোগ্য মডিউলগুলি সমর্থন করে যা আরও বিল্ট-ইন সরবরাহ করতে পারে।

OS পসিক্সের কাছে অজানা তবে কেএসএস এবং বেশ কয়েকটি শেল বিশেষ in
OS POSIX এ সাধারন, তবে ksh এবং অন্যান্য বেশ কয়েকটি শেল বিশেষ।
³ ইন ksh, কীওয়ার্ডের timesচারপাশে একটি মোড়ক time: এটি একটি উপাধি { { time;} 2>&1;}। নোট করুন যে POSIX timeএকটি সাধারণ পার্সিং বা একটি কীওয়ার্ড সহ একটি বহিরাগত ইউটিলিটি হতে দেয় যা একটি সম্পূর্ণ পাইপলাইনের ক্ষেত্রে প্রযোজ্য (যা এটি ksh, zsh এ ব্যাশ)।


3
এই পার্থক্যগুলি সত্যই গুরুত্বপূর্ণ।
dmckee

দ্রুত প্রশ্ন, সুতরাং "সাধারণ প্যারামিটার অ্যাসাইনমেন্ট" এর অর্থ কী while IFS= read -r line?
সের্গেই কলডিয়াজনি

@SergiyKolodyazhnyy readএকটি বিশেষ builtin, তাই নয় IFS=readশুধুমাত্র কমান্ড চলাকালীন পরিবর্তনশীল সেট করে।
গিলস

10

একটি বিল্টিন হ'ল একটি বাহ্যিক প্রোগ্রামের চেয়ে শেল দ্বারা প্রদত্ত একটি কমান্ড। এখানে bashবিল্টিনগুলির তালিকা (সেগুলি ব্যাশ ম্যান পৃষ্ঠাতেও তালিকাভুক্ত রয়েছে) এবং zshএর বিল্টিনগুলির তালিকা রয়েছেkshচালিয়ে একটি তালিকা সরবরাহ করে builtin

কোনও নির্দিষ্ট কমান্ডটি অন্তর্নির্মিত কিনা তা জানতে আপনি চালাতে পারেন type command। এটি দেখুন type forএবং type lsদেখুন।


typeকৌশলটি মনে হচ্ছে; এর জন্য ধন্যবাদ ... তবে আমি এখনও অবাক হয়েছি "শেল দ্বারা প্রদত্ত" এর অর্থ কী ... সম্ভবত শেলটি কার্নেলের সাথে কীভাবে সম্পর্কযুক্ত তা আমাকে আরও পুরোপুরি বুঝতে হবে .... তবে দুপুর ২ টা নয় ... আমি আসব আগামীকাল
এদিকে

1

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

আপনি সহজেই খুঁজে বের করতে পারেন কিনা একটি নির্দিষ্ট কমান্ড একটি builtin বা চলমান নয় type mycommand। বেশিরভাগ শেল ম্যান পৃষ্ঠাগুলিতে তাদের বিল্টিনগুলির একটি তালিকা থাকে।

সম্পাদনা: ব্যবহার করুন typeখুঁজে বের করতে কমান্ড একটি builtin থাকা অবস্থায় এবং যদি না whichযেখানে এটি থেকে মৃত্যুদন্ড কার্যকর করা হবে জানতে।


@ কালেব: আপনার মন্তব্যের জন্য ধন্যবাদ, তবে এটি "সিস্টেম প্রক্রিয়া" আসলে কী তা নিয়ে আমাকে ভাবতে ছাড়তে বাধ্য করে .. আমি তখনকার উল্লেখগুলি দেখতে থাকি তবে পার্থক্যটি মিথ্যা বলে আমি বুঝতে পারি না .... (বিটিডব্লু আমি পারব না দেখুন 'কোনটি' একটি পরম সূচক) .. উদাহরণস্বরূপ .. 'যা প্রতিধ্বনি =>"/bin/echo" and টাইপ করে ইকো =>"echo is a shell builtin", but 'which dd=> "/ বিন / ডিডি" এবং type dd=> "ডিডি হয় / বিন / ডিডি" ... সুতরাং, আমি সেখানে আংশিক ....
পিটার.ও

"সিস্টেম সংগ্রহগুলি" এর অর্থ হ'ল এটি কার্নেল দ্বারা পরিচালিত একটি স্বতন্ত্র অ্যাপ্লিকেশন হিসাবে শুরু করা হচ্ছে। বিল্টিনগুলির ক্ষেত্রে বিকল্পটি আপনার শেলের ইতিমধ্যে চলমান কোডে কেবলমাত্র একটি উপ-ফাংশন চলছে। আপনি যে উদাহরণটি দিয়েছেন, typeএটি কি চালানো হচ্ছে তার পক্ষে আরও ভাল সূচক, তবে আপনি লক্ষ্য করেছেন echoযে উভয়ই একটি বিল্টিন এবং সেই নামের সাথে একটি অ্যাপ্লিকেশন রয়েছে। যদি আপনার শেলটিতে একটি অন্তর্নির্মিত ব্যবস্থা না থাকে তবে এটি চালিত হবে।
কালেব

2
whichঅগত্যা একটি বিল্ট-ইন কমান্ড নয় এবং এটি না হলে এটি শেলের বিল্ট-ইনগুলি সম্পর্কে জানতে পারে না know পসিক্সের জন্য এটি typeঅন্তর্নির্মিত কমান্ড হওয়া দরকার, তাই এটি সর্বদা বিল্ট-ইনগুলি সম্পর্কে জানে।
সিজেএম

একজন ওরফে সঙ্গে অনেক সিস্টেম জাহাজ whichথেকে typeবা বিকল্প যেমন কিছু সেট alias which='type -path'- এই বিভ্রান্তির উৎস হতে পারে।
র্যান্ডম 832

1
whichপ্রতিস্থাপন না করা পর্যন্ত আমি এটিকে উজ্জীবিত করতে পারি না type। আমি বারবার যা ব্যবহার করেছি, জানতাম না typeএবং জানার জন্য খুব অবাক হয়েছিলাম which, যদি ঠিক প্রোগ্রাম হয় তবে প্রোগ্রামগুলির মধ্যে সিদ্ধান্ত নিলে।
ব্যবহারকারী অজানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.