`যা but তবে সব


19

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


1
আমার সিস্টেম, এটি মানুষের পৃষ্ঠায় তালিকাভুক্ত প্রথম জিনিস আছে: which --all
শন জে গফ

2
আমার উপর (লিনাক্স) এটি কেবল which -a
ব্যবহারকারী অজানা

উত্তর:


23

কিছু সিস্টেমে which -aসমস্ত ম্যাচ দেখায়। যদি আপনার শেলটি বাশ বা zsh¹ হয় তবে আপনি তার typeপরিবর্তে ব্যবহার করতে পারেন : type fooপ্রথম ম্যাচটি type -a fooদেখায় এবং সমস্ত মিল দেখায়। তিনটি আদেশ type, whichএবং whenceবেশিরভাগই একই জিনিস; এগুলি শেল এবং অপারেটিং সিস্টেমের উপলব্ধতা, বিকল্পগুলি এবং ঠিক কীভাবে তারা রিপোর্ট করে তার মধ্যে পার্থক্য রয়েছে। typeসর্বদা উপলভ্য এবং সম্ভাব্য সমস্ত কমান্ডের মতো নাম (উপকরণ, কীওয়ার্ডস, শেল বিল্ট-ইনস, ফাংশন এবং বাহ্যিক আদেশগুলি) দেখায়।

সমস্ত ম্যাচ প্রদর্শনের একমাত্র সম্পূর্ণ পোর্টেবল উপায় হ'ল $PATHনিজেকে পার্স করা । এখানে এটির একটি শেল স্ক্রিপ্ট রয়েছে। যদি আপনি এটিকে শেল ফাংশন করেন তবে নিশ্চিত হয়ে নিন যে ফাংশন বডিটি বন্ধনীতে আবদ্ধ করুন (যাতে ফাংশনে পরিবর্তন আসে IFSএবং set -fএড়াতে না পারে), এবং এতে পরিবর্তন exitহয় return

#!/bin/sh
set -f       # disable globbing
IFS=:        # break words at : only
not_found=1
for d in $PATH; do
  if [ -f "$d/$x" ] && [ -x "$d/$x" ]; then
    printf '%s\n' "$d/$x"
    not_found=0
  fi
done
exit $not_found

Document বা ksh 93 ডকুমেন্টেশন অনুসারে, যদিও ksh 93s + 2008-01-31 আমি প্রথম চেষ্টা করলেই প্রথম ম্যাচটি মুদ্রণ করে।


এই shকোডটি খালি উপাদানগুলিতে থাকলে সঠিকভাবে কাজ করে না $PATH। এছাড়াও খেয়াল করুন যে $IFSক্ষেত্রের ডিলিমিটার (কমপক্ষে POSIX শেলগুলিতে) থাকার সময় $PATH, কোলন ফিল্ড বিভাজক হিসাবে ব্যবহৃত হয় । whichএকটি সঠিক প্রয়োগের জন্য ডিবানিতে পাওয়া স্ক্রিপ্টটি দেখুন ।
স্টাফেন চেজেলাস

typeমধ্যে builtin ksh93u+ 2012-08-01ঠিকমত কাজ বলে মনে হয়।
স্টাফেন চেজেলাস

5

- সমস্ত বা -a পতাকা আপনাকে আপনার পাথের সমস্ত ম্যাচ এবং উপাধি (কমপক্ষে ফেডোরা, উবুন্টু এবং সেন্টোস এ) প্রদর্শন করবে:

which -a which

এআইএক্স এবং সোলারিসে এটি আপনাকে ঘনিষ্ঠ করবে:

echo "$PATH" | sed -e 's/:/ /g' | \
while read -r p; do find "$p" -type f -name "which"; done

প্যারামিটার বিকল্পগুলির চারপাশে আপনার ডাবল উদ্ধৃতি প্রয়োজন, অন্যথায় $PATHসাদা অংশে বা শেল গ্লোব্বিং অক্ষরগুলি থাকলে স্ক্রিপ্টটি কাজ করবে না । read -rব্যাকস্ল্যাশগুলি সহ্য করার জন্য প্রয়োজনীয় is এটি একটি ভাল পদ্ধতি নয় কারণ findএকটি ডিরেক্টরিতে $PATHসাব- ডিরেক্টরি অন্তর্ভুক্ত থাকে তবে এটি দীর্ঘ সময় নিতে পারে এবং উত্সাহী ম্যাচগুলি ফিরিয়ে দিতে পারে । ভাগ্যক্রমে, findএখানে দরকারী নয়; আমার উত্তর দেখুন।
গিলস'স 'দুষ্ট হওয়া বন্ধ করুন'

আমি জানতাম ভুল অনুভব করেছি যেহেতু এটি অবশ্যই নেস্টেড ডিরেক্টরিগুলিতে ধীর হবে। B PATH এ গ্লোববিং এবং স্পেসস? eww। তবে আপনি ঠিক বলেছেন (যদিও আপনি এতটা না বলে যথেষ্ট ভাল ছিলেন): আমার এক লাইনারটি খারাপ লেখা ছিল।
এলি হেডি

1

যদি আপনার কাছে কোনও whichসমর্থনকারী -aবা whenceউপলভ্য না থাকে তবে আপনার নিজস্ব রোল করুন:

#!/bin/sh -f

IFS=":"
for PART in $PATH
do
  if test -x "$PART/$1"
  then
    echo $PART/$1
  fi
done

আপনি set -fঅরক্ষিতদের উপর গ্লোবিং বন্ধ করতে অনুপস্থিত $PATHtest -fএখানে কেবল এক্সিকিউটেবল ফাইলগুলি চাওয়া যথেষ্ট নয়; আপনার যা দরকার তা test -x। হুঁ, আমি বুঝতে পারি আমি আমার স্ক্রিপ্টে নিয়মিত ফাইল পরীক্ষা ভুলে গেছি।
গিলস

@ গিলস: আপনার টিপস অনুসারে সম্পাদিত। আমি সবই শুদ্ধির জন্য, তবে আমি এর whence README.txtমতোই অসম্ভব বলে মনে করি whence "file* wi?h we!rd name"। ট্র্যাভার করা কত সহজ তা কেবল দেখানোর চেষ্টা করছি $PATH
ম্যাটবিয়ানকো

0

অন্তর্নির্মিত শেল হিসাবে ksh এবং zsh এর "কোথাও" রয়েছে। whence -azsh এর অধীনে আপনি যা চান তা করে:

 7:27AM 7 % whence -a cat
/usr/bin/cat
/bin/cat
/usr/bin/cat
/bin/cat

আমাকে zsh এ PATH পরিষ্কার করতে হবে, এতে আমার প্রচুর ডুপ্লিকেট রয়েছে। whence -aksh এর অধীনে আলাদাভাবে কাজ করে:

$ whence -a cat
cat is a tracked alias for /usr/bin/cat

আমার বলতে হবে, এটিও একটি সম্ভাব্য কার্যকর আচরণের মতো বলে মনে হচ্ছে।

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