প্রতিধ্বনি কেন কমান্ড ইন শেল নির্মিত হয়?


34
$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat

কেন প্রতিধ্বনি মত একটি স্বাধীন উপযোগ নয় ls, ps, catইত্যাদি? কেন এটি শেল নির্দিষ্ট? কোন ভাল কারণ?


5
মনে রাখবেন এটি শেল-নির্দিষ্ট। জেডএসএইচ এটি তৈরি করে, বাস তা করে না।
tsvalleender

21
@tsv: echoঅবশ্যই হয় একটি ব্যাশ builtin। আসলে, এটি প্রতিটি বড় আধুনিক শেলের একটি অন্তর্নির্মিত।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

উত্তর:


71

বিল্টিন দুটি শ্রেণি রয়েছে:

  1. কিছু কমান্ড শেল প্রোগ্রামে নিজেই তৈরি করতে হয় কারণ তারা বাহ্যিক হলে তারা কাজ করতে পারে না।

    cdএটির মধ্যে একটি হ'ল যদি এটি বাহ্যিক হয় তবে এটি কেবল নিজস্ব ডিরেক্টরি পরিবর্তন করতে পারে; এটি শেলের বর্তমান কার্যকারী ডিরেক্টরিকে প্রভাবিত করতে পারে না। (আরও দেখুন: একটি প্রোগ্রাম কেন হয় cdনা? )

  2. অন্যান্য শ্রেণীর কমান্ডগুলি খাঁটিভাবে দক্ষতার জন্য তৈরি করা হয়।

    Man পৃষ্ঠা আছে যা উল্লেখ builtins উপর একটি অধ্যায় আছে , এবং এই শ্রেণীর হিসেবে কমান্ড উদাহরণ।dash printfechotest

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

আমি বিশ্বাস করি echoএটিএন্ডটি ইউনিক্স সিস্টেম ভি রিলিজ ৩.১ এ শেল তৈরি হয়েছে। আমি এটি ভিত্তি করে এটিটি এন্ড এসএস 3 বি 1 সিরিজ ইউনিক্স সিস্টেমের জন্য ম্যানুয়াল দুটি পৃথক সংস্করণের তুলনা করে । কেউ এই ম্যানুয়ালগুলির 1986 সংস্করণ দয়া করে স্ক্যান করে অনলাইনে রেখেছেন ; এগুলি এসভিআর 3 এর মূল প্রকাশের সাথে মিলে যায়। আপনি দেখতে পাবেন যে ইউনিক্স সিস্টেম ভি ব্যবহারকারীর ম্যানুয়াল, দ্বিতীয় খণ্ডেরecho 523 পৃষ্ঠার তালিকায় নেই , যেখানে কমান্ডটি শেলটি তৈরি করা থাকলে আপনি এটি আশা করতে পারেন। 1987 থেকে SVR3.1 ম্যানুয়াল আমার স্থানীয় কাগজ কপি সালে করা হয় ম্যানুয়াল এই বিভাগে তালিকাভুক্ত।echo

আমি নিশ্চিত যে এটি বার্কলে সিএসআরজি উদ্ভাবন নয় যা এটিএন্ডটি ঘরে ফিরিয়ে এনেছে। 4.3BSD একই বছর এসভিআর 3, 1986 হিসাবে প্রকাশিত হয়েছিল, তবে আপনি যদি 4.3BSD এর sh.1 ম্যানপেজটি দেখেন তবে আপনি দেখতে পাবেন যে echo"স্পেশাল কমান্ডস" বিভাগের অন্তর্নির্মিত কমান্ডের তালিকায় নেই। যদি সিএসআরজি এটি করে, এটি আমাদের প্রমাণ করার জন্য একটি নথিভুক্ত উত্স চায়।

এই মুহুর্তে, আপনি ভাবতে পারেন echoযে এসভিআর 3 .1 এর আগে শেলের মধ্যে নির্মিত হয়েছিল এবং এই সত্যটি কেবল তখন পর্যন্ত নথিভুক্ত করা হয়নি। আমার কাছে উপলব্ধ নতুন প্রি-এসভিআর 3 এটিএন্ডটি ইউনিক্স উত্স কোডটি পিডিপি -11 সিস্টেম তৃতীয় টারবালটিতে রয়েছে , যেখানে আপনি বোর্ন শেল উত্স কোডটি পাবেন। আপনি echoবিল্টিন কমান্ড টেবিলটিতে পাবেন না, যা এতে রয়েছে /usr/src/cmd/sh/msg.c। সেই ফাইলে থাকা টাইমস্ট্যাম্পগুলির ভিত্তিতে এটি প্রমাণ করে যে echo1980 সালে অবশ্যই শেলের মধ্যে ছিল না।


তুচ্ছ বস্তু

একই ডিরেক্টরিতে এমন একটি ফাইলও রয়েছে builtin.cযা এই প্রশ্নের জন্য কোনও অন-পয়েন্ট ধারণ করে না, তবে আমরা এই আকর্ষণীয় মন্তব্যটি পাই:

/*      
    builtin commands are those that Bourne did not intend
    to be part of his shell.
    Redirection of i/o, or rather the lack of it, is still a
    problem..
*/      

সিসভিউ ইউএম এর দ্বিতীয় পৃষ্ঠার 385 পৃষ্ঠায় আপনি উল্লেখ করেছেন, printksh এর জন্য বিল্টিন কমান্ড রয়েছে যা বলা হয় যে এটি আচরণ করবে echo। এই কমান্ডটি আইএসসি থেকে এটি অ্যান্ড টি ইউনিক্স এসভিআর 4 2.1 আই 386 এর মতো কিছুতে উপস্থিত রয়েছে। print "\012"প্রতিধ্বনিত হবে একই ফলন। ভাবছেন কেন Ksh মুদ্রণ করেছিল এবং অন্তর্নির্মিত প্রতিধ্বনিত হয়নি? যাইহোক সত্যিই আকর্ষণীয়।

কয়েক বছর আগে এমন কয়টি রত্ন ২০১ 2016 সালে সম্পাদনা দ্বারা সন্ধানের জন্য অপেক্ষা করছিল? +1
ইরুভার

+1 টি। ধন্যবাদ। আপনি আমার (নিয়মিত) পড়া / শেখার জন্য একটি কমান্ড বিল্টিন তৈরির উদ্দেশ্যে উত্স (রেফারেন্স) সরবরাহ করতে পারেন?
টিম

নিয়মিতভাবে পড়তে বা শিখতে আমি কিছু রেফারেন্স, ম্যানুয়াল বা মানক খুঁজে পেতে চাই। আমি এটি ব্যাশের রেফারেন্স ম্যানুয়াল এবং পসিক্সের স্পেসিফিকেশনগুলিতে সন্ধান করার চেষ্টা করেছি। তবে আমি এটি খুঁজে পাচ্ছি না। আমি সেগুলি মিস করেছি কিনা তা নিশ্চিত নই।
টিম

@ টিম: এটি এবং অন্যান্য উত্তরগুলি এখানে যেমন ব্যাখ্যা করে, কিছু কমান্ড অবশ্যই শেলের মধ্যে তৈরি করা উচিত বা তারা তাদের কাজটি করতে পারে না। অন্য সমস্তগুলি সম্পূর্ণরূপে alচ্ছিক । এটাই মূলত আমার বোর্নের শেল সোর্স স্নিপেট উপরে যা বলেছিল তা আসলে। যেহেতু শেলের মধ্যে এই জাতীয় কমান্ডগুলি নির্মাণ করা alচ্ছিক, একটি অনুমোদিত যুক্তি কেবলমাত্র একজন প্রয়োগকারীর মতামত দিতে পারে।
ওয়ারেন ইয়ং

19

কিছু কমান্ডগুলি অন্তর্নির্মিত হওয়ার তৃতীয় কারণ রয়েছে: বাহ্যিক কমান্ডগুলি চালানো অসম্ভব হলে এগুলি ব্যবহার করা যেতে পারে।

কখনও কখনও একটি সিস্টেম এতটাই ভাঙ্গা হয়ে যায় যে lsকমান্ডটি কার্যকর করে না। কিছু ক্ষেত্রে, একটি echo *এখনও কাজ করবে।

আর একটি (আরও গুরুত্বপূর্ণ!) উদাহরণ kill: যদি কোনও সিস্টেম ফ্রি পিআইডি ছাড়ায় তবে এটি চালানো সম্ভব হয় না /bin/kill(কারণ এটির জন্য পিআইডি :-) প্রয়োজন, তবে বিল্ট-ইন killকাজ করবে।

বিটিডাব্লু।, whichএকটি বাহ্যিক কমান্ড (কমপক্ষে এটি ব্যাশের অভ্যন্তরীণ নয়), সুতরাং এটি অভ্যন্তরীণ আদেশগুলি তালিকাভুক্ত করতে পারে না। এই ক্ষেত্রে:

$ which echo
/bin/echo
$ type -a echo
echo is a shell builtin
echo is /bin/echo

ভুলে যাবেন না যে প্রায় সমস্ত বাহ্যিক এক্সিকিউটেবল লাইব্রেরি ফাইলগুলিতে নির্ভর করে। কখনও কখনও বিপর্যয় ঘটে এবং সেই লাইব্রেরিগুলি লোড করা যায় না (পরামর্শ: ldconfigআপনি কী করছেন ঠিক তা না জানলে সমস্যা হয় না)। এছাড়াও, আপনি যদি নিজের / বিনটিকে বা আপনার / এসবিন পার্টিশনটি দূরে সরিয়ে দেন, তবুও শেলটি লোড হয়েছে কি?
LawrenceC

আপনি যদি পিআইডি চালিয়ে যান তবে আপনি কোন পিআইডি মারতে চান তা খুঁজে পাওয়া মুশকিল। আপনি কোনও psকমান্ড চালাতে পারবেন না , সুতরাং আপনাকে পিআইডিগুলি ম্যানুয়ালি খুঁজে পেতে হবে /proc
ক্যাস্পারড

যদিও (কমপক্ষে) সেন্টোস whichহ'ল একটি বাশ ওরফে যা চালিত হয় alias | /usr/bin/which --read-alias ...যাতে বহিরাগত পরিচয় সনাক্ত which করতে পারে (তবে এখনও বিল্টিনস নয়)। আমি এই উজ্জ্বল বা বিকৃত বিবেচনা করবেন কিনা তা আমি সিদ্ধান্ত নিতে পারি না।
ডেভ_থমপসন_085

Ls কমান্ডটি আর কাজ করে না এমন বিন্দুতে, আমি মনে করি আপনার বুট / মাস্টারের পরিবর্তে ড্রাইভটি স্লেভ হিসাবে মাউন্ট করা উচিত এবং ফাইল স্ট্রাকচারটি সেভাবে ঠিক করা উচিত। আমি নিশ্চিত নই যে আপনি যদি কোনও ফাইলের প্রতিধ্বনি> না করেন তবে আপনি কীভাবে সিস্টেম দুর্নীতির সেই পরিমাণটি ঠিক করতে পারবেন এবং এটি ঠিক করতে দীর্ঘ সময় লাগবে। মঞ্জুরিপ্রাপ্ত যে আপনি একটি ব্যাশ স্ক্রিপ্ট লিখতে পারেন যা সিস্টেমের কাঠামোটি ঠিক করে।
jonnyjandles

13

বাশ রেফারেন্স ম্যানুয়াল অনুসারে , এটি সুবিধার্থে।

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

উন্নত ব্যাশ স্ক্রিপ্টিং গাইড আরো বিস্তারিত ব্যাখ্যা আছে:

"একজন builtin কমান্ড ব্যাশ টুল সেট, আক্ষরিক সালে নির্মিত মধ্যে অন্তর্ভুক্ত করা হয় এই কর্মক্ষমতা কারণে পারেন হয় -। Builtins দ্রুত চালানো বহিরাগত কমান্ড, যা সাধারণত বন্ধ forking প্রয়োজন চেয়ে 1 আলাদা প্রক্রিয়া - বা কারণ একটি নির্দিষ্ট builtin সরাসরি দরকার শেল ইন্টার্নাল অ্যাক্সেস। "

এছাড়াও লক্ষ্য করুন যে echoকিছু সিস্টেমে স্ট্যান্ডেলোন ইউটিলিটি হিসাবে উপস্থিত রয়েছে। আমার ডারউইন সিস্টেমে আমার যা আছে তা এখানে রয়েছে (ম্যাকোএসএক্স 10.5.8 - চিতাবাঘ)

$ uname -a
Darwin host.foo.org 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386
$ bash --version
GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0)
Copyright (C) 2005 Free Software Foundation, Inc.
$ which echo
/bin/echo

echoবিল্টিন হিসাবেও উপলভ্য, তবে স্পষ্টতই আমার স্ক্রিপ্টগুলি আমার ম্যাকটিতে / বিন / প্রতিধ্বনি ব্যবহার করে এবং আমার বেশিরভাগ লিনাক্স এবং ফ্রিবিএসডি সিস্টেমগুলিতে ব্যাশ বিল্টিন ব্যবহার করে। তবে এটি কোনও তাত্পর্যপূর্ণ বলে মনে হয় না, কারণ স্ক্রিপ্টগুলি এখনও সর্বত্র সূক্ষ্মভাবে কাজ করে।


3
শেল বিল্ট-ইনগুলির কথা বলতে গেলে, আপনার "কোন" এর পরিবর্তে "টাইপ" ব্যবহার করা উচিত।
টেডি

ধন্যবাদ @ টেডি। আমি এটা করতে শুরু করেছি, যখন আমার মনে পড়ে। জীবন অনেক ভাল ধন্যবাদ ধন্যবাদ type
স্টিফান লাসিউইস্কি

6

ভিএইচএম এর উত্তর পরিপূরক করতে, ধরা যাক /binদুর্ঘটনাক্রমে আপনার থেকে সরানো হয়েছিল PATH। আপনি echo $PATHএটি সন্ধান করতে সক্ষম হবেন , তাই না?


2

যদিও বর্তমানে বেশিরভাগ শেলগুলির মধ্যে একটি অন্তর্নির্মিত অন্তর্ভুক্ত রয়েছে echo, GNU CoreUtils এ এর ​​স্ট্যান্ডেলোন বাস্তবায়নও অন্তর্ভুক্ত করেছে:

$ which echo
/bin/echo
$ dpkg -S /bin/echo
coreutils: /bin/echo

দেখে মনে হচ্ছে আপনার জিএনইউ কোরিউটিল ইনস্টল নেই (বেশিরভাগ লিনাক্স ভিত্তিক ডেস্কটপ এবং সার্ভার ওএস এ এটি ডিফল্টরূপে ইনস্টল করা আছে তবে এম্বেডড লিনাক্স বা অন্যান্য ইউএনআইএক্স এর পরিবর্তে শেল ইউটিলিটিগুলির বিকল্প সংগ্রহ ব্যবহার করতে পারে)।

BTW: আপনি তাকান busybox , আপনি দেখতে পাবেন ls, psএবং catসেখানে বিল্ট-ইন করা হয় কমান্ড (বা অন্তত হতে পারে; এটা embeded সিস্টেমের জন্য ব্যবহার করা হয়ে এবং সবকিছু প্রয়োজন না ফেলে রাখা যেতে পারে)।


3
মূল পোস্টারের পরীক্ষাগুলি যে অনুমান /bin/echoনেই তা অনুমান করে না। তারা কেবল দেখায় যে বিল্টিন echoপ্যাথের যে কোনও প্রোগ্রামের চেয়ে অগ্রাধিকার নেয় ।
ওয়ারেন ইয়ং

1

echoশেল বিল্টিন হওয়া উচিত এর আসল কারণ এখানে :

ধরুন আপনি একটি পাসওয়ার্ড $PASSWORD। আপনি কিভাবে এটি একটি ফাইল লিখবেন ./password? স্বাভাবিকভাবেই বেশিরভাগ প্রোগ্রামার লিখতেন:

echo "$PASSWORD" >./password

তবে echoশেল বিল্টিন না থাকলে psতথ্যের মাধ্যমে পাসওয়ার্ডটি সকল ব্যবহারকারীর কাছে ফাঁস হয়ে যেত ।

অবশ্যই, যদি আপনি এটি সম্পর্কে চতুর হতে চান তবে আপনি পাসওয়ার্ড ছাড়াই একটি উপায় খুঁজে পেতে পারেন echo, সম্ভবত অন্য কোনও শেল বৈশিষ্ট্যটি ব্যবহার করে:

cat >./password <<EOF
${PASSWORD}
EOF

তবে echoকোনও বিল্টিন হিসাবে থাকা একটি ফাইলের পাসওয়ার্ড সংরক্ষণের সবচেয়ে সুস্পষ্ট উপায় হিসাবে কাজ করা একটি গুরুত্বপূর্ণ সিটবেল্ট হিসাবে কাজ করা উচিত।


3
যদিও একটি কার্যকর পার্শ্ব প্রতিক্রিয়া আমি এটি অত্যন্ত সন্দেহজনক যে এটি কারণ ছিল।
প্লাগওয়াশ

@ ডিপ্রেসডডানিয়েল: আপনাকে ব্যাক আপ কী করবে? আপনি আপনার উত্তর সমর্থন করতে ব্যবহৃত রেফারেন্সটি কোথায়?
জোকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.