আপনি কখনই ভাবেন নি যে এটি সম্পর্কে জানতে চাইবেন না এমন সমস্ত এখানে:
সারাংশ
বোর্নের মতো শেল স্ক্রিপ্টে এক্সিকিউটেবলের পাথের নাম পাওয়ার জন্য (কয়েকটি ক্যাভেট রয়েছে; নীচে দেখুন):
ls=$(command -v ls)
প্রদত্ত আদেশটি উপস্থিত রয়েছে কিনা তা জানতে:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
একটি ইন্টারেক্টিভ বোর্নের মতো শেলের প্রম্পটে:
type ls
whichকমান্ড সি-শেল থেকে একটি ভাঙা ঐতিহ্য রয়েছে এবং বোর্ন মত শাঁস একা ছেড়ে দেওয়া হয়।
ব্যবহারের ক্ষেত্রে
কোনও স্ক্রিপ্টের অংশ হিসাবে সেই তথ্যটি অনুসন্ধান করার বা শেল প্রম্পটে ইন্টারেক্টিভভাবে পার্থক্য রয়েছে।
শেল প্রম্পটে, সাধারণ ব্যবহারের কেসটি হ'ল: এই আদেশটি অদ্ভুত আচরণ করে, আমি কি সঠিকটি ব্যবহার করছি? টাইপ করলে ঠিক কী ঘটেছিল mycmd? আমি কি এটি আরও তাকান করতে পারি?
সেক্ষেত্রে আপনি জানতে চাইবেন যে আপনি কমান্ডটি আসলে কমান্ডটি না দিয়েই কমান্ডটি চাওয়ার সময় আপনার শেলটি কী করে।
শেল স্ক্রিপ্টগুলিতে এটি বেশ আলাদা হতে থাকে। শেল স্ক্রিপ্টে আপনি জানতে চান যে আপনি যেখানে করতে চান তা যদি চালানো হয় তবে কোথায় বা কোন কমান্ড কী তা জানতে চাওয়ার কোনও কারণ নেই। সাধারণত, আপনি যা জানতে চান সেটি এক্সিকিউটেবলের পথ, সুতরাং আপনি এ থেকে আরও তথ্য পেতে পারেন (এর সাথে সম্পর্কিত অন্য কোনও ফাইলের পাথের মতো, বা সেই পথে এক্সিকিউটেবল ফাইলের বিষয়বস্তু থেকে তথ্য পড়তে পারেন)।
ইন্টারেক্টিভ আপনার সম্পর্কে জানতে চাইতে পারেন সবmy-cmd কমান্ড সিস্টেমে উপলব্ধ, স্ক্রিপ্ট-এ, খুব কমই তাই।
উপলভ্য বেশিরভাগ সরঞ্জাম (যেমন প্রায়ই হয়) ইন্টারেক্টিভভাবে ব্যবহারের জন্য ডিজাইন করা হয়েছে।
ইতিহাস
ইতিহাসের একটি বিট আগে।
Un০ এর দশকের শেষভাগ পর্যন্ত প্রাথমিক ইউনিক্স শেলগুলির কোনও ফাংশন বা উপকরণ ছিল না। এক্সিকিউটেবলের মধ্যে কেবল theতিহ্যবাহী চেহারা $PATH। csh1978 চারপাশের চালু alias লেখা (যদিও cshপ্রথম মুক্তি মধ্যে 2BSDএকটি প্রক্রিয়াকরণ, মে 1979 সালে), এবং এছাড়াও .cshrcশেল কাস্টমাইজ করতে ব্যবহারকারীদের জন্য (প্রতি শেল, যেমন cshলেখা আছে .cshrc, এমনকি যখন না ইন্টারেক্টিভ স্ক্রিপ্ট মত)।
বোর্ন শেলটি ১৯৯৯ এর প্রথমদিকে ইউনিক্স ভি in এ প্রথম প্রকাশিত হওয়ার সময়, ফাংশন সমর্থনটি কেবলমাত্র অনেক পরে যুক্ত হয়েছিল (1984 সালে এসভিআর 2 তে) এবং যাইহোক, এতে কখনও কোনও rcফাইল ছিল না (এটি .profileআপনার পরিবেশকে কনফিগার করতে হবে, প্রতি সেলে শেল নয় )।
csh বোর্ন শেলটির চেয়ে অনেক বেশি জনপ্রিয় হয়ে উঠেছে (যদিও এটি বোর্ন শেলের তুলনায় অত্যন্ত খারাপ সিনট্যাক্স ছিল) এটি ইন্টারেক্টিভ ব্যবহারের জন্য আরও অনেক সুবিধাজনক এবং চমৎকার বৈশিষ্ট্য যুক্ত করছিল।
ইন 3BSD(1980), একটি whichcsh শেল স্ক্রিপ্ট জন্য যোগ করা হয়েছিল cshব্যবহারকারীদের একটি এক্সিকিউটেবল শনাক্ত করতে সহায়তা করার, এবং এটি একটি কমই বিভিন্ন স্ক্রিপ্ট হিসাবে আপনি জানতে পারেন এর whichঅনেক বাণিজ্যিক Unices আজকাল (সোলারিস, এইচপি / ইউএক্স, AIX অথবা Tru64 মত) উপর।
এই স্ক্রিপ্টটি ব্যবহারকারীর পড়বে ~/.cshrc(সমস্ত cshস্ক্রিপ্টগুলির মতো এটি না করা ছাড়া csh -f), এবং প্রদত্ত কমান্ডের নাম (গুলি) উপাধিকার তালিকায় এবং $path(অ্যারে যে cshভিত্তিতে বজায় থাকে $PATH) সন্ধান করে।
আপনি এখানে যান, whichসেই সময়ে সর্বাধিক জনপ্রিয় শেলের জন্য প্রথম এসেছিলেন (এবং cshএটি 90-এর দশকের মাঝামাঝি পর্যন্ত জনপ্রিয় ছিল) এটি মূল কারণ যা এটি বইগুলিতে নথিভুক্ত হয়েছিল এবং এখনও বহুল ব্যবহৃত হয়।
মনে রাখবেন, এমনকি কোনও cshব্যবহারকারীর জন্যও , এই whichcsh স্ক্রিপ্টটি আপনাকে যথাযথভাবে সঠিক তথ্য দেয় না। এটি সংজ্ঞায়িতভাবে উপস্থাগুলি পায় যা ~/.cshrcআপনি পরে প্রম্পটে বা উদাহরণস্বরূপ sourceঅন্য কোনও cshফাইল আইং দ্বারা সংজ্ঞায়িত করেছেন এবং এটি (যদিও এটি ভাল ধারণা হবে না), এর PATHমধ্যে নতুন সংজ্ঞা দেওয়া যেতে পারে ~/.cshrc।
whichবোর্ন শেল থেকে এই কমান্ডটি চালানো , এখনও আপনার মধ্যে সংজ্ঞায়িত এলিয়াসগুলির সন্ধান করবে ~/.cshrc, তবে যদি আপনি ব্যবহার না করেন এমন একটি না থাকে তবে cshসম্ভবত এটি আপনাকে সঠিক উত্তর পেতে পারে।
বিল্টিন typeকমান্ড সহ এসভিআর 2-তে 1984 পর্যন্ত বোর্ন শেলের সাথে অনুরূপ কার্যকারিতা যুক্ত হয়নি । যে এটি builtin আছে (একটি বহিস্থিত স্ক্রিপ্ট থেকে ভিন্ন) এর মানে হল যে এটা করতে ডান তথ্য (কিছুটা হলেও) দিতে যেমন শেলের অভ্যন্তরীণ অ্যাক্সেস আছে।
প্রাথমিক typeকমান্ডটি whichস্ক্রিপ্টের মতো একই সমস্যার মুখোমুখি হয়েছিল যাতে কমান্ডটি পাওয়া না গেলে এটি ব্যর্থতার প্রস্থান স্থিতি ফিরিয়ে দেয় না। এছাড়াও, এক্সিকিউটেবলের পক্ষে, বিপরীতে which, এটি এর ls is /bin/lsপরিবর্তে এমন কিছু আউটপুট দেয় /bin/lsযা স্ক্রিপ্টগুলিতে ব্যবহার করা কম সহজ করে তোলে।
ইউনিক্স সংস্করণ 8 এর (বন্যের মধ্যে প্রকাশিত হয়নি) বোর্ন শেলটির এটির নতুন typeনামকরণ হয়েছে whatis। এবং প্লান 9 (ইউনিক্সের একসাথে উত্তরসূরি) শেলটি rc(এবং এর ডেরিভেটিভগুলি এর মতো akangaএবং es) রয়েছে whatis।
cshবোর্ন শেলের শীর্ষে অনেকগুলি বৈশিষ্ট্য (লাইন সম্পাদক, উপাধি ...) যুক্ত করেছেন, কর্ন শেল (একটি উপসেট যার মধ্যে পসিক্স শ সংজ্ঞা উপর ভিত্তি করে) ৮০-এর দশকের মাঝামাঝি সময়ে তৈরি হয়েছিল তবে ব্যাপকভাবে পাওয়া যায় না । এটা তার নিজের যোগ whence(ছাড়াও builtin type) যা বেশ কয়েকটি বিকল্প গ্রহণ ( -vসঙ্গে প্রদান type-একটি বাগাড়ম্বরপূর্ণ আউটপুট, এবং -pএক্সেকিউটেবল (না alias লেখা / ফাংশন ...) কেবল দেখুন)।
এটিএন্ডটি এবং বার্কলে-এর মধ্যে কপিরাইট সংক্রান্ত সমস্যার জন্য উদ্বেগের ঘটনাচক্রে, 80 এর দশকের গোড়ার দিকে 80 এর দশকের গোড়ার দিকে কয়েকটি ফ্রি সফটওয়্যার শেল বাস্তবায়ন প্রকাশিত হয়েছিল। অ্যালকুইস্ট শেলের সমস্ত (ছাই, বিএসডিগুলিতে বোর্ন শেল প্রতিস্থাপনের জন্য), ksh (pdksh) এর পাবলিক ডোমেন বাস্তবায়ন, bash(এফএসএফ দ্বারা স্পনসরিত), zsh1989 এবং 1991-এর মধ্যে প্রকাশিত হয়েছিল।
অ্যাশ, যদিও বোর্ন শেলের প্রতিস্থাপন বলে বোঝানো হয়েছে typeঅনেক পরে (নেটবিএসডি 1.3 এবং ফ্রিবিএসডি ২.৩ এ) অবধি বিল্টিন ছিল না, যদিও এটি ছিল hash -v। ওএসএফ / 1 /bin/shএর একটি typeবিল্টিন ছিল যা সর্বদা 0 ওএসএফ / 1 ভি 3.x এ ফিরে আসে। পাথ ( যেমনটি হবে ) মুদ্রণ করতে এবং সমস্ত ম্যাচিং কমান্ডের প্রতিবেদন করার জন্য একটি বিকল্প bashযোগ করা হয়নি । তৈরি builtin এবং যোগ কমান্ড মত অভিনয় এর । তাদের সব আছে।whence-ptypetype -pwhence -p-atcshwhichwherebashtype -azsh
fishশেল (2005) একটি আছে typeকমান্ড একটি ফাংশন হিসাবে প্রয়োগ করা।
whichCsh শেল স্ক্রিপ্ট এদিকে NetBSD বা থেকে অপসারণ করা হয়েছে (যেমন tcsh শেল এবং অন্যান্য শাঁস অনেক না ব্যবহারের builtin ছিল), এবং যোগ করা কার্যকারিতা whereis(যখন যেমন প্রার্থনা which, whereisমত আচরণ whichছাড়া এটি শুধুমাত্র এক্সেকিউটেবল আপ দেখায় $PATH)। ওপেনবিএসডি এবং ফ্রিবিএসডি-তে, whichসি-তে লেখা একটিতেও পরিবর্তন করা হয়েছিল যা $PATHকেবলমাত্র কমান্ড সন্ধান করে ।
বাস্তবায়নের
whichবিভিন্ন সিনট্যাক্স এবং আচরণ সহ বিভিন্ন ইউনিয়নে একটি কমান্ডের কয়েক ডজন বাস্তবায়ন রয়েছে ।
লিনাক্স অন (মধ্যে builtin বেশী পাশে tcshএবং zsh) আমরা বেশ কিছু বাস্তবায়নের পাবেন। উদাহরণস্বরূপ সাম্প্রতিক ডেবিয়ান সিস্টেমগুলিতে এটি একটি সাধারণ পসিক্স শেল স্ক্রিপ্ট যা এতে কমান্ড সন্ধান করে $PATH।
busyboxএকটি whichকমান্ড আছে।
GNU whichসম্ভবত একটি অতি উত্তেজক একটি যা আছে । এটি whichঅন্যান্য শেলের সাথে সিএসএস স্ক্রিপ্ট কী করেছিল তা প্রসারিত করার চেষ্টা করে : আপনার এ্যালিয়াস এবং ফাংশন কী তা আপনি এটি বলতে পারেন যাতে এটি আপনাকে আরও ভাল উত্তর দিতে পারে (এবং আমি বিশ্বাস করি যে কিছু লিনাক্স ডিস্ট্রিবিউশনগুলি এটির জন্য কিছু বিশ্বব্যাপী উপাত্ত সেট bashকরে) ।
zshএক্সিকিউটেবলের পথে প্রসারিত করতে বেশ কয়েকটি অপারেটর রয়েছে : = ফাইলনাম এক্সপেনশন অপারেটর এবং :cহিস্টোরি এক্সপেনশন মডিফায়ার (এখানে প্যারামিটার বিস্তারের ক্ষেত্রে প্রয়োগ করা হয়েছে ):
$ print -r -- =ls
/bin/ls
$ cmd=ls; print -r -- $cmd:c
/bin/ls
zshমধ্যে zsh/parametersমডিউল নামেও কমান্ড হ্যাশ টেবিল তোলে commandsএসসিয়েতিভ আরে:
$ print -r -- $commands[ls]
/bin/ls
whatisউপযোগ (ইউনিক্স V8 বোর্ন শেল বা পরিকল্পনা 9 এক জন্য ব্যতীত rc/ es) সত্যিই এর সাথে সম্পর্কিত নয় এটি শুধুমাত্র ডকুমেন্টেশন জন্য হিসাবে (whatis ডাটাবেসের greps, যে man পৃষ্ঠা সারসংক্ষেপ 'হল)।
whereisএটি একই সাথে যুক্ত করা 3BSDহয়েছিল whichযদিও এটি লিখিত ছিল C, cshএকই সাথে নির্বাহযোগ্য, ম্যান পৃষ্ঠা এবং উত্সটি অনুসন্ধানের জন্য ব্যবহৃত হয়েছিল, তবে বর্তমান পরিবেশের উপর ভিত্তি করে নয়। সুতরাং আবার, এটি একটি পৃথক প্রয়োজনের জবাব দেয়।
এখন, স্ট্যান্ডার্ড ফ্রন্টে, পসআইএক্স command -vএবং -Vকমান্ডগুলি নির্দিষ্ট করে (যা পসিএক্সএক্স .২০০৮ পর্যন্ত alচ্ছিক ব্যবহৃত হত)। ইউএনআইএক্স typeকমান্ডটি নির্দিষ্ট করে (কোনও বিকল্প নেই)। এটা সমস্ত ( where, which, whenceকোন মান নির্দিষ্ট হয় না)
কিছু সংস্করণ পর্যন্ত, typeএবং command -vলিনাক্স স্ট্যান্ডার্ড বেস নির্দিষ্টকরণে alচ্ছিক ছিল যা ব্যাখ্যা করে যে উদাহরণস্বরূপ কিছু পুরানো সংস্করণ posh(যদিও pdkshউভয়টি ছিল তার ভিত্তিতে ) দুটি ছিল না didn't command -vকিছু বোর্ন শেল বাস্তবায়নেও যোগ করা হয়েছিল (সোলারিসের মতো)।
আজকের অবস্থা
আজকাল স্ট্যাটাসটি হ'ল typeএবং command -vবোর্নের মতো সমস্ত শেলগুলি সর্বব্যাপী (যদিও @ জার্নো দ্বারা উল্লিখিত হয়েছে, পোসিক্স bashমোডে না থাকলে বা মন্তব্যে নীচে অ্যালামকুইস্ট শেলের কিছু বংশধর না থাকলে সাবধানতা / বাগ নোট করুন )। tcshএকমাত্র শেল যেখানে আপনি ব্যবহার করতে চান which(যেমন সেখানে নেই typeএবং whichঅন্তর্নির্মিত নেই)।
ছাড়া অন্য শেল সালে tcshএবং zsh, whichআপনি যতদিন কোন ওরফে বা ফাংশন যা একই নামের আমাদের কোন আছে হিসেবে দেওয়া এক্সিকিউটেবল পথ বলতে পারে ~/.cshrc, ~/.bashrcবা কোন শেল প্রারম্ভকালে ফাইল এবং আপনি সংজ্ঞায়িত না $PATHআপনার ~/.cshrc। আপনার যদি কোনও এলিফ বা ফাংশন এর জন্য সংজ্ঞায়িত করা থাকে তবে এটি আপনাকে এটি সম্পর্কে বলতে বা নাও বলতে পারে, বা আপনাকে ভুল জিনিসটি বলতে পারে।
আপনি যদি কোনও নির্দিষ্ট নাম দিয়ে সমস্ত কমান্ড জানতে চান তবে বহনযোগ্য কিছুই নেই। আপনি এই ব্যবহার করতে চাই whereমধ্যে tcshবা zsh, type -aএ bashবা zsh, whence -aksh93 এবং অন্যান্য শাঁস, আপনি ব্যবহার করতে পারেন typeএকযোগে সঙ্গে which -aযা কাজ করতে পারে।
প্রস্তাবনা
এক্সিকিউটেবলের কাছে পাথের নাম পাওয়া
এখন, স্ক্রিপ্টে এক্সিকিউটেবলের পাথের নাম পেতে, কয়েকটি ক্যাভেট রয়েছে:
ls=$(command -v ls)
এটি করার মানক উপায় হবে।
যদিও কয়েকটি সমস্যা রয়েছে:
- কার্যকর না করে মৃত্যুদন্ড কার্যকর করার পথটি জানা সম্ভব নয়। সকল
type, which, command -v... সমস্ত ব্যবহারের হিউরিস্টিক পথ খুঁজে বের করতে। তারা $PATHউপাদানগুলি লুপ করে এবং প্রথম নন-ডিরেক্টরি ফাইল খুঁজে পায় যার জন্য আপনি অনুমতি কার্যকর করেছেন। তবে শেলের উপর নির্ভর করে, কমান্ডটি কার্যকর করার ক্ষেত্রে, তাদের মধ্যে অনেকগুলি (বোর্ন, এটিএন্ডটি কেএস, জেডএস, অ্যাশ ...) ঠিক $PATHততক্ষণ তাদের ক্রিয়াকলাপ করবে যতক্ষণ না execveসিস্টেম কলটি ত্রুটি সহ ফিরে না আসে until । উদাহরণস্বরূপ যদি $PATHথাকে /foo:/barএবং আপনি কার্যকর করতে চান তবে lsতারা প্রথমে কার্যকর করার চেষ্টা করবে /foo/lsবা যদি এটি ব্যর্থ হয় /bar/ls। এখন মৃত্যুদণ্ড কার্যকর করা/foo/lsব্যর্থ হতে পারে কারণ আপনার মৃত্যুদণ্ডের অনুমতি না থাকলেও অন্যান্য অনেক কারণে, যেমন এটি কার্যকর বৈধ নয়। যদি আপনার জন্য মৃত্যুদন্ড কার্যকর করার অনুমতি থাকে command -v lsতবে প্রতিবেদন করবে তবে বৈধ কার্যকর কার্যকরযোগ্য না হলে দৌড়ানো আসলে চালানো হতে পারে ।/foo/ls/foo/lsls/bar/ls/foo/ls
- যদি
fooঅন্তর্নির্মিত বা ফাংশন বা উপন্যাস হয়, command -v fooফিরে আসে foo। সঙ্গে কিছু শাঁস পছন্দ ash, pdkshবা zsh, এটি ফেরত দিতে পারেন fooযদি $PATHখালি স্ট্রিং অন্তর্ভুক্ত এবং সেখানে একটি এক্সিকিউটেবল এর fooবর্তমান ডিরেক্টরির মধ্যে ফাইল। কিছু পরিস্থিতি রয়েছে যেখানে আপনার এটি বিবেচনার প্রয়োজন হতে পারে। উদাহরণস্বরূপ মনে রাখবেন যে বিল্টিনগুলির তালিকা শেল বাস্তবায়নের সাথে পরিবর্তিত হয় (উদাহরণস্বরূপ, mountকখনও কখনও ব্যস্তবক্সের জন্য অন্তর্নির্মিত sh) এবং উদাহরণস্বরূপ bashপরিবেশ থেকে ফাংশনগুলি পেতে পারে।
- শেলের উপর নির্ভর করে যদি
$PATHআপেক্ষিক পাথ উপাদানগুলি থাকে (সাধারণত .বা খালি স্ট্রিং যা উভয়ই বর্তমান ডিরেক্টরিকে নির্দেশ করে তবে কিছু হতে পারে) থাকতে পারে তবে এটি command -v cmdকোনও পরম পাথ আউটপুট নাও করতে পারে। সুতরাং আপনি চালনার সময় আপনি যে পথটি পেয়েছেন সেটি অন্য কোনও জায়গায় command -vআপনার পরে আর কার্যকর হবে cdনা।
- অকল্পনীয়: ksh93 শেল সঙ্গে, যদি
/opt/ast/bin(যদিও যে সঠিক পথ বিভিন্ন ব্যবস্থা আমি বিশ্বাস করি উপর বিভিন্ন রকমের হতে পারে) আপনি হয় $PATH, ksh93 প্রাপ্তিসাধ্য কিছু অতিরিক্ত builtins (করতে হবে chmod, cmp, cat...), কিন্তু command -v chmodফিরে আসবে /opt/ast/bin/chmodএমনকি যদি সেই পথ doesn ' অস্তিত্ব নেই
একটি কমান্ড বিদ্যমান কিনা তা নির্ধারণ করা হচ্ছে
প্রদত্ত আদেশটি মানকভাবে বিদ্যমান কিনা তা জানতে আপনি এটি করতে পারেন:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
যেখানে কেউ ব্যবহার করতে চাইবে which
(t)csh
ইন cshএবং tcsh, আপনার খুব পছন্দ নেই। ইন tcsh, যে যেমন সূক্ষ্ম whichbuiltin হয়। ইন csh, এটি হবে সিস্টেম whichকমান্ড, যা কিছু ক্ষেত্রে আপনি যা চান তা নাও করতে পারে।
কেবল কয়েকটি শেলের মধ্যে কমান্ডগুলি সন্ধান করুন
একটি ক্ষেত্রে যেখানে এটি ব্যবহার করতে জানার জন্য হতে পারে whichযদি আপনি সম্ভাব্য শেল builtins বা ফাংশন উপেক্ষা কমান্ড পথ জানতে চাই, bash, csh(না tcsh), dashঅথবা Bourneশেল স্ক্রিপ্ট, যে শাঁস আছে না whence -p(যেমন kshঅথবা zsh) , command -ev(যেমন yash), whatis -p( rc, akanga) বা একটি বিল্টিন which(যেমন tcshবা zsh) এমন সিস্টেমে যেখানে whichউপলব্ধ এবং cshস্ক্রিপ্টটি নয়।
যদি এই শর্তগুলি পূরণ হয় তবে:
echo=$(which echo)
আপনাকে প্রথমে পথ দিতে হবে echoমধ্যে $PATH(কোণ ক্ষেত্রে ব্যতীত), কিনা নির্বিশেষে echoএকটি শেল builtin / ওরফে / ফাংশন বা না হতে হবে।
অন্যান্য শেলগুলিতে, আপনি পছন্দ করবেন:
- zsh :
echo==echoবা echo=$commands[echo]বাecho=${${:-echo}:c}
- ksh , zsh :
echo=$(whence -p echo)
- যশ :
echo=$(command -ev echo)
- আরসি , আকাঙ্গা :
echo=`whatis -p echo`(স্পেস সহ রাস্তাগুলি থেকে সাবধান থাকুন)
- মাছ :
set echo (type -fp echo)
মনে রাখবেন যে আপনি যা করতে চান তা যদি সেই আদেশটি চালানো হয় তবে echoআপনাকে এর পথটি পেতে হবে না, আপনি কেবল এটি করতে পারেন:
env echo this is not echoed by the builtin echo
উদাহরণস্বরূপ, এর সাথে tcsh, বিল্টিন whichব্যবহার করা থেকে রোধ করতে :
set Echo = "`env which echo`"
যখন আপনার একটি বাহ্যিক কমান্ড দরকার হয়
আরেকটি ক্ষেত্রে যেখানে আপনি ব্যবহার করতে পারেন whichযখন আপনি আসলে প্রয়োজন একটি বহিস্থিত কমান্ড। পসিক্সের প্রয়োজন যে সমস্ত শেল বিল্টিনগুলি (যেমন command) বাহ্যিক কমান্ড হিসাবেও উপলব্ধ থাকে, তবে দুর্ভাগ্যক্রমে commandঅনেক সিস্টেমে এটি হয় না। উদাহরণস্বরূপ, commandলিনাক্স ভিত্তিক অপারেটিং সিস্টেমে কোনও কমান্ড পাওয়া বিরল, যখন তাদের বেশিরভাগের একটি whichকমান্ড থাকে (যদিও বিভিন্ন বিকল্প এবং আচরণের সাথে পৃথক পৃথক)।
যেসব ক্ষেত্রে আপনি বহিরাগত কমান্ড চাইতে পারেন সেখানে পসিক্স শেল না দিয়ে আপনি যেখানে কোনও আদেশ প্রয়োগ করবেন would
system("some command line"), popen()... C অথবা বিভিন্ন ভাষায় কার্যাবলী যে কমান্ড লাইন বিশ্লেষণ করতে একটি শেল ডাকা, তা করেন system("command -v my-cmd")তাদের মধ্যে কাজ। perlএটির একটি ব্যতিক্রম হ'ল যদি শেলটি কোনও বিশেষ চরিত্র (স্থান ব্যতীত) না দেখে শেলটিকে অনুকূল করে তোলে। এটি এর ব্যাকটিক অপারেটরের ক্ষেত্রেও প্রযোজ্য:
$ perl -le 'print system "command -v emacs"'
-1
$ perl -le 'print system ":;command -v emacs"'
/usr/bin/emacs
0
$ perl -e 'print `command -v emacs`'
$ perl -e 'print `:;command -v emacs`'
/usr/bin/emacs
:;উপরোক্ত যে সংযোজন perlসেখানে একটি শেল আহবান। ব্যবহার করে which, আপনাকে সেই কৌশলটি ব্যবহার করতে হবে না।
whichএকটি ইন্টারেক্টিভ শেল প্রসঙ্গে ধরে নিচ্ছেন। এই প্রশ্নটি ট্যাগ / বহনযোগ্যতা। তাই আমি "কি পরিবর্তে ব্যবহার করার জন্য যেমন এই প্রেক্ষাপটে প্রশ্ন ব্যাখ্যাwhichএকটি প্রদত্ত নামের প্রথম এক্সিকিউটেবল এটি$PATH"।whichএলিয়াস, বিল্টিন এবং ফাংশনগুলির সাথে চুক্তির বিরুদ্ধে বেশিরভাগ উত্তর এবং কারণগুলি , যা বেশিরভাগ বাস্তব-বিশ্বের পোর্টেবল শেল স্ক্রিপ্টগুলিতে কেবল একাডেমিক আগ্রহ interest শেল স্ক্রিপ্ট চালানোর সময় স্থানীয়ভাবে সংজ্ঞায়িত উপাধি উত্তরাধিকার সূত্রে প্রাপ্ত হয় না (যদি আপনি এটির উত্স না করেন.)