আপনি কখনই ভাবেন নি যে এটি সম্পর্কে জানতে চাইবেন না এমন সমস্ত এখানে:
সারাংশ
বোর্নের মতো শেল স্ক্রিপ্টে এক্সিকিউটেবলের পাথের নাম পাওয়ার জন্য (কয়েকটি ক্যাভেট রয়েছে; নীচে দেখুন):
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
। csh
1978 চারপাশের চালু alias লেখা (যদিও csh
প্রথম মুক্তি মধ্যে 2BSD
একটি প্রক্রিয়াকরণ, মে 1979 সালে), এবং এছাড়াও .cshrc
শেল কাস্টমাইজ করতে ব্যবহারকারীদের জন্য (প্রতি শেল, যেমন csh
লেখা আছে .cshrc
, এমনকি যখন না ইন্টারেক্টিভ স্ক্রিপ্ট মত)।
বোর্ন শেলটি ১৯৯৯ এর প্রথমদিকে ইউনিক্স ভি in এ প্রথম প্রকাশিত হওয়ার সময়, ফাংশন সমর্থনটি কেবলমাত্র অনেক পরে যুক্ত হয়েছিল (1984 সালে এসভিআর 2 তে) এবং যাইহোক, এতে কখনও কোনও rc
ফাইল ছিল না (এটি .profile
আপনার পরিবেশকে কনফিগার করতে হবে, প্রতি সেলে শেল নয় )।
csh
বোর্ন শেলটির চেয়ে অনেক বেশি জনপ্রিয় হয়ে উঠেছে (যদিও এটি বোর্ন শেলের তুলনায় অত্যন্ত খারাপ সিনট্যাক্স ছিল) এটি ইন্টারেক্টিভ ব্যবহারের জন্য আরও অনেক সুবিধাজনক এবং চমৎকার বৈশিষ্ট্য যুক্ত করছিল।
ইন 3BSD
(1980), একটি which
csh শেল স্ক্রিপ্ট জন্য যোগ করা হয়েছিল csh
ব্যবহারকারীদের একটি এক্সিকিউটেবল শনাক্ত করতে সহায়তা করার, এবং এটি একটি কমই বিভিন্ন স্ক্রিপ্ট হিসাবে আপনি জানতে পারেন এর which
অনেক বাণিজ্যিক Unices আজকাল (সোলারিস, এইচপি / ইউএক্স, AIX অথবা Tru64 মত) উপর।
এই স্ক্রিপ্টটি ব্যবহারকারীর পড়বে ~/.cshrc
(সমস্ত csh
স্ক্রিপ্টগুলির মতো এটি না করা ছাড়া csh -f
), এবং প্রদত্ত কমান্ডের নাম (গুলি) উপাধিকার তালিকায় এবং $path
(অ্যারে যে csh
ভিত্তিতে বজায় থাকে $PATH
) সন্ধান করে।
আপনি এখানে যান, which
সেই সময়ে সর্বাধিক জনপ্রিয় শেলের জন্য প্রথম এসেছিলেন (এবং csh
এটি 90-এর দশকের মাঝামাঝি পর্যন্ত জনপ্রিয় ছিল) এটি মূল কারণ যা এটি বইগুলিতে নথিভুক্ত হয়েছিল এবং এখনও বহুল ব্যবহৃত হয়।
মনে রাখবেন, এমনকি কোনও csh
ব্যবহারকারীর জন্যও , এই which
csh স্ক্রিপ্টটি আপনাকে যথাযথভাবে সঠিক তথ্য দেয় না। এটি সংজ্ঞায়িতভাবে উপস্থাগুলি পায় যা ~/.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
(এফএসএফ দ্বারা স্পনসরিত), zsh
1989 এবং 1991-এর মধ্যে প্রকাশিত হয়েছিল।
অ্যাশ, যদিও বোর্ন শেলের প্রতিস্থাপন বলে বোঝানো হয়েছে type
অনেক পরে (নেটবিএসডি 1.3 এবং ফ্রিবিএসডি ২.৩ এ) অবধি বিল্টিন ছিল না, যদিও এটি ছিল hash -v
। ওএসএফ / 1 /bin/sh
এর একটি type
বিল্টিন ছিল যা সর্বদা 0 ওএসএফ / 1 ভি 3.x এ ফিরে আসে। পাথ ( যেমনটি হবে ) মুদ্রণ করতে এবং সমস্ত ম্যাচিং কমান্ডের প্রতিবেদন করার জন্য একটি বিকল্প bash
যোগ করা হয়নি । তৈরি builtin এবং যোগ কমান্ড মত অভিনয় এর । তাদের সব আছে।whence
-p
type
type -p
whence -p
-a
tcsh
which
where
bash
type -a
zsh
fish
শেল (2005) একটি আছে type
কমান্ড একটি ফাংশন হিসাবে প্রয়োগ করা।
which
Csh শেল স্ক্রিপ্ট এদিকে 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 -a
ksh93 এবং অন্যান্য শাঁস, আপনি ব্যবহার করতে পারেন 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/ls
ls
/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
, যে যেমন সূক্ষ্ম which
builtin হয়। ইন 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 শেল স্ক্রিপ্ট চালানোর সময় স্থানীয়ভাবে সংজ্ঞায়িত উপাধি উত্তরাধিকার সূত্রে প্রাপ্ত হয় না (যদি আপনি এটির উত্স না করেন.
)