কেন সেখানে একটি / বিন / প্রতিধ্বনি রয়েছে এবং আমি কেন এটি ব্যবহার করতে চাই?


52

আমি লক্ষ্য করেছি যে /bin/echoআমার উবুন্টু মেট 17.04 সিস্টেমে বাইনারি কার্যকর করা যায় ।

আমি ভেবেছিলাম, এটা অদ্ভুত, কারণ

$ type echo
echo is a shell builtin

কার্সারি টেস্টিং পরামর্শ দেয় যে /bin/echoবাশ বিল্টিনের মতো একই ধরণের কাজ করে echo:

$ /bin/echo foo
foo
$ /bin/echo $USER
zanna

সুতরাং, কেন echoবাশ প্রোগ্রাম থেকে আলাদা আলাদা সংস্করণ রয়েছে এবং কেন বা কখন আমি এটি ব্যবহার করতে চাই?



2
@ bodhi.zazen এটি একই রকম না হলেও এটি বেশ কার্যকর, কারণ এটি এই প্রশ্নের কথোপকথনকে সম্বোধন করে। এই প্রশ্নটি কেন echoশেল বিল্টিন হিসাবে সরবরাহ করা হয় তা জিজ্ঞাসা করে , যখন এটি জিজ্ঞাসা করে কেন এটি বাহ্যিক কমান্ড হিসাবে সরবরাহ করা হয়।
এলিয়াহ

3
একটি কারণ হ'ল সবাই বাশ ব্যবহার করে না। আমি অনুমান করব যে / বিন / প্রতিধ্বনি বাশকে পূর্বাভাস দেয় এবং নির্মাতারা এটি কার্যকর করার পরিবর্তে বিল্ট-ইন হিসাবে অন্তর্ভুক্ত করা দরকারী / দক্ষ বলে মনে করেন।
jamesqf

উত্তর:


87

আপনি যদি কোনও bashপ্রম্পট খোলেন এবং একটি echoকমান্ড টাইপ করেন তবে এটি চালনার পরিবর্তে শেল বিল্টিন ব্যবহার করে /bin/echo। যে কারণগুলি এটি এখনও /bin/echoবিদ্যমান তা গুরুত্বপূর্ণ :

  1. আপনি সর্বদা শেল ব্যবহার করেন না। বিভিন্ন পরিস্থিতিতে আপনি শেকের মাধ্যমে নয় সরাসরি এক্সিকিউটেবল চালান।
  2. কমপক্ষে তত্ত্বে, কিছু শেলের একটি echoবিল্টিন থাকে না। এটি আসলে প্রয়োজন হয় না।

# 1 প্রসারিত করার জন্য, আপনাকে সব নিয়মিত ফাইল যাদের নাম দিয়ে শুরু সরাতে চেয়েছিলেন অনুমান করা abcযে কোন জায়গায় srcকরতে dest। এটি করার বিভিন্ন উপায় রয়েছে তবে তাদের মধ্যে একটি হ'ল:

find src -name 'abc*' -type f -exec mv -nv {} dest/ \;

তবে ধরুন, এটি চালানোর চেয়ে আপনি প্রথমে চালানো প্রতিটি কমান্ড দেখতে চান। ঠিক আছে, তারপরে আপনি echoকমান্ডটি আগে থেকেই চালাতে পারেন ঠিক যেমন আপনি অন্যান্য প্রসঙ্গে থাকতে পারেন:

find src -name 'abc*' -type f -exec echo mv -nv {} dest/ \;

তবে findশেল ব্যবহার করে না। যে রান /bin/echo

findসাথে -execবা-execdir ছাড়াও , /bin/echoএক্সিকিউটেবলকে অন্য প্রোগ্রামগুলি দ্বারা কল করা হবে যা তারা নিজেরাই প্রোগ্রাম চালায় তবে শেলের মাধ্যমে নয়। এই ঘটবে সঙ্গে xargsকমান্ড (যা সম্পর্কযুক্ত করতে find), সেইসাথে যেমন অন্যান্য প্রসঙ্গে একটি সংখ্যা লাইন এর একটি ফাইল । আরেকটি উদাহরণ হ'ল আপনি যখন চালান , যা কাজ করে যা পরীক্ষার জন্য কার্যকর হতে পারে ।Exec=.desktopsudo echosudo

একইভাবে, কিছু শাঁসের একটি printfবিল্টিন /usr/bin/printfরয়েছে তবে এটি বিদ্যমান।

আপনি ইচ্ছাকৃতভাবে ব্যবহার করার একটি কম সাধারণ সম্ভাব্য কারণ /bin/echoহ'ল যদি আপনি এর echoশেল দ্বারা সরবরাহ করা কমান্ডের মধ্যে পার্থক্য নির্ভর করে থাকেন । man echoদলিল /bin/echo; help echoমধ্যে bash নথি bashbuiltin। echoখুব বহনযোগ্য নয়, কারণ বিভিন্ন বাস্তবায়ন - উভয় অপারেটিং সিস্টেম জুড়ে এবং একই অপারেটিং সিস্টেমের শেল জুড়ে - বিভিন্ন বিকল্প (যেমন, -e) সমর্থন করে এবং তাদের ব্যাকস্ল্যাশগুলির চিকিত্সার ক্ষেত্রে পৃথক । অবশ্যই, এই জাতীয় বিবরণ উপর নির্ভর না করা এবং printfপরিবর্তে ব্যবহার করা ভাল, যা আরও বেশি বহনযোগ্য

ইন bash, আপনি করতে পারেন typebuiltin প্রদর্শনী /bin/echoপাশাপাশি - অভিমানী /binহয় আপনার $PATHযেমন এটা সবসময় হতে হবে - দ্বারা এটি ক্ষণস্থায়ী -aপতাকা :

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

21
এবং এছাড়াও কারণ পসিক্স স্পেসিফিকেশন বলে যে এটি থাকা দরকার।
গ্লেন জ্যাকম্যান

4
@glennjackman আমি আশা করছিলাম যে আসলে কেউ এই সম্পর্কে একটি উত্তর পোস্ট করবে, এবং আমি আশা করি আপনি এটি করার সিদ্ধান্ত নিয়েছেন! কিছু তনিমা জড়িত, যদিও, তন্ন তন্ন ডেবিয়ান, উবুন্টু, কিংবা গনুহ Coreutils (কিংবা গনুহ প্রকল্পের সার্বিক) হিসাবে POSIX মেনে চলতে চেষ্টা করে সবকিছু । উদাহরণস্বরূপ, পসআইএক্স একটি cdএক্সিকিউটেবল অস্তিত্বের উপর জোর দেয় (যা চালানোর সময় ডিরেক্টরি পরিবর্তন করে এবং প্রস্থান করে, কলারটি যেখানে আগে ছিল সেখানে রেখে দেয়) এবং কিছু ওএসের একটি থাকে। জিএনইউ স্ট্যান্ডার্ডগুলিতে 4.1 উল্লেখ করা সহায়ক হতে পারে ।
এলিয়াহ

@ এলিয়াকাগান: ঘটনা / ইউএসআর / বিন / সিডি এর একটি ব্যবহার রয়েছে: / usr / bin / cd ডিরেক্টরি কমান্ড সেই ডিরেক্টরিতে সেই কমান্ডটি চালায়। ডিরেক্টরি পরিবর্তন ব্যর্থ হলে কমান্ড শুরু হয় না।
জোশুয়া

4
@ জোশুয়ার আরও ভাল ব্যবহার cdকেবলমাত্র একটি প্রদত্ত ডিরেক্টরিতে অ্যাক্সেসের দক্ষতার পরীক্ষা হিসাবে হ'ল: /usr/bin/cd some/dirসফল হলে , একটি শটে আপনি পরীক্ষা করেছেন: ক) যা some/dirবিদ্যমান, খ) যে এটি ডিরেক্টরি বা এটির একটি লিঙ্ক, এবং গ) ডিরেক্টরিটি অ্যাক্সেস করার জন্য আপনার প্রয়োজনীয় অনুমতি প্রয়োজন; আপনার নিজের রাষ্ট্র পরিবর্তন না করে সব।
মুড়ু

1
@ কার্লউইথথফট, দেখুন প্রিন্টফ ইকোয়ের চেয়ে ভাল কেন? আপনি উইন্ডোজ ব্যবহার /bin/echoনা করে এটিও নয় \bin\echo। ;)
ওয়াইল্ডকার্ড

31

এলিয় এর উত্তর দেওয়ার জন্য দুর্দান্ত কাজ করেছে তবে আমি " echoবাশ প্রোগ্রাম থেকে আলাদা হওয়ার অন্য সংস্করণ কেন " অংশ সম্পর্কে মন্তব্য করতে চাই । এটাই ভুল প্রশ্ন।

সঠিক প্রশ্নটি হল: এটি কেন প্রথম স্থানে একটি বিল্টিন , যখন এটি পুরোপুরি সূক্ষ্ম বাহ্যিক আদেশ হতে পারে (এবং)?

সরলতার জন্য, ড্যাশের বিল্টিনগুলি একবার দেখুন, একটি পরিমাপ 38 (বাশের সাথে 61 এর তুলনা করা হয়েছে, এর আউটপুট দ্বারা যাচ্ছে compgen -b):

.               continue        getopts         readonly        type
:               echo            hash            return          ulimit
[               eval            jobs            set             umask
alias           exec            kill            shift           unalias
bg              exit            local           test            unset
break           export          printf          times           wait
cd              false           pwd             trap
command         fg              read            true

এগুলোর মধ্যে কত প্রয়োজন builtins হতে? [, echo, false, printf, pwd, test, এবং trueনা প্রয়োজন builtins হতে: সেগুলিকে কিছু শুধুমাত্র একটি builtin কি করতে পারেন যে কি না (প্রভাব ফেলবে না অথবা শেল রাষ্ট্র যে বহিরাগত কমান্ড উপলব্ধ নয় প্রাপ্ত)। বাশের printfকমপক্ষে বিল্টিন হওয়ার সুবিধা গ্রহণ করে: printf -v varআউটপুটটিকে ভেরিয়েবলে সংরক্ষণ করে vartimeইন ব্যাশটিও বিশেষ: একটি কীওয়ার্ড হয়ে, আপনি বাশ-এ স্বেচ্ছাসেবক কমান্ড তালিকার সময় দিতে পারেন (ড্যাশের timeসমতুল্য থাকে না )। pwdহয় বিল্টিন হওয়ার দরকার নেই - যে কোনও বহিরাগত কমান্ড চলমান ওয়ার্কিং ডিরেক্টরিটি উত্তরাধিকারী হতে চলেছে (এবং এটি বাহ্যিক কমান্ডও )।:ব্যতিক্রম - আপনার একটি এনওপি দরকার, এবং :এটি is বাকিগুলি এমন কোনও ক্রিয়া করে যা কোনও বাহ্যিক কমান্ড সহজেই করতে পারে।

সুতরাং, এই বিল্টিনগুলির একটি পঞ্চমাংশ বিল্টিনগুলি লাগবে না। তাহলে কেন? র manpage * আসলে ক্ষণস্থায়ী কেন builtins (জোর খনি) হয় ব্যাখ্যা করে:dash

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

এটি এতটা সুন্দর: এই বিল্টিনগুলি সেখানে রয়েছে কারণ এগুলি প্রায়শই, ইন্টারেক্টিভ এবং স্ক্রিপ্টগুলিতে ব্যবহৃত হয় এবং তাদের কার্যকারিতা যথেষ্ট সহজ, যে শেলটি কাজটি করতে পারে। আর তাই হয়: কিছু (? অধিকাংশ) শাঁস কাজ গ্রহণ করেন ** ফিরে যান। থেকে 2.9 বাসদ , এবং আপনি একটি পাবে না builtin।shecho

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


* এটি আলমকুইস্ট শেলের জন্য সংশ্লিষ্ট ম্যানপেজ পাঠ্যের সাথে প্রায় অনুরূপ , যা ড্যাশ, ড্যাবিয়ান অ্যালকুইস্ট শেলটি ভিত্তিক।

** zshএই ধারণাটিকে চূড়ান্ত দিকে নিয়ে যায়: বিভিন্ন মডিউল লোড করে আপনি যে কমান্ডগুলি পেয়েছেন, যেমন zmv, এমন কোনও জিনিস যা আপনি ভাবেন না যে কোনও শেল এমনকি intoুকতে হবে । এই মুহুর্তে, আসল প্রশ্নটি: আপনি কেন zsh এর পরিবর্তে বাশ ব্যবহার করবেন, যার মধ্যে এই সমস্ত বিল্টিন রয়েছে?


1
দেখা যাচ্ছে যে: কোনও বিল্টিন হওয়ার দরকার নেই। এটি বিল্টিন না হওয়ার পক্ষে কেবল নির্বোধ। আপনি যদি প্রাথমিকভাবে রেসকিউ-ফ্লপি-ডিস্ক স্তরের সমস্যাগুলির সাথে ডিল না করেন (তবে ক্ষেত্রেই আমি হার্ড উপায় আবিষ্কার করেছি যে পিডব্লিউডি নির্ভরযোগ্যভাবে কাজ করে না) বিল্টিন হিসাবে এটি না করার একমাত্র শাস্তি হ'ল ভয়ঙ্কর কর্মক্ষমতা।
জোশুয়া

5
@ জোশুয়া না, :বাহ্যিক হিসাবে সত্যই কোনও এনওপি হবে না, আপনার তখনও নজর থাকবে PATH, কমান্ড কার্যকর করার চেষ্টা করা হবে ইত্যাদি, যখন আপনি সত্যিই চান সমস্ত কিছুই স্পষ্টভাবে না করার জন্য। :যেমন একটি বিল্টিন তা করে।
মুড়ু

2
pwd"লজিকাল" পাথ ( pwd -L) দেখানোর ডিফল্ট আচরণের সাথে বাশকে এটির মতো কাজ করার জন্য বাস্তবে অন্তর্নির্মিত হওয়া দরকার । /bin/pwdকেবলমাত্র pwd -Pআপনাকে প্রকৃত অভিভাবক ডিরেক্টরিগুলি দেখানোর আচরণই বাস্তবায়ন করতে পারে, আপনি যে সিএমলিংকটি সম্পাদনা করেছিলেন তা নয় cd
পিটার কর্ডস

2
@ পিটারকর্ডসের pwdঅবস্থান কিছুটা উপস্থিতির দ্বারা কিছুটা আপোস করা হয়েছে PWD, তবে হ্যাঁ, কার্যকারিতা উন্নত করতে বিল্টিন স্ট্যাটাস ব্যবহার করে বাশ দেওয়ারও এটি একটি উদাহরণ
মুরু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.