`जो`, लेकिन सभी


19

मुझे लगता है कि अधिकांश whichकमांड से परिचित हैं , और मैं इसका अक्सर उपयोग करता हूं। मैं बस एक ऐसी स्थिति में भाग गया, जहां मैं उत्सुक हूं कि मेरे रास्ते में कौन सा कमांड पहले नहीं है, लेकिन मेरे सभी रास्तों में कितने और कहां सभी कमांड हैं। मैंने किस मैन पेज की कोशिश की (टाइपिंग man whichने मुझे हंसाया), लेकिन कुछ भी नहीं देखा।


1
मेरे सिस्टम पर, यह मैन पेज पर सूचीबद्ध पहली चीज़ है which --all:।
शॉन जे। गोफ

2
मेरा (linux) पर यह केवल है which -a
उपयोगकर्ता अज्ञात 8

जवाबों:


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

¹ या ksh 93, प्रलेखन के अनुसार, हालांकि ksh 93s + 2008-01-31 केवल पहला मैच प्रिंट करता है जब मैं कोशिश करता हूं।


shयदि खाली घटक हैं तो यह कोड ठीक से काम नहीं करता है $PATH। यह भी ध्यान दें कि $IFSएक क्षेत्र सीमांकक (POSIX गोले में कम से कम) है $PATH, जबकि में , क्षेत्र विभाजक के रूप में कोलन का उपयोग किया जाता है । whichएक सही कार्यान्वयन के लिए डेबियन पर मिली स्क्रिप्ट देखें ।
स्टीफन चेज़लस

typeमें निर्मित ksh93u+ 2012-08-01ठीक से काम करने लगता है।
स्टीफन चेज़लस

5

--All या -a ध्वज आपको अपने पथ में सभी मैच दिखाएगा, और उपनाम (कम से कम फेडोरा, उबंटू और सेंटोस पर):

which -a which

AIX और Solaris पर, यह आपको पास मिलेगा:

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

पैरामीटर प्रतिस्थापन के आसपास आपको दोहरे उद्धरण चिह्नों की आवश्यकता होती है, अन्यथा यदि स्क्रिप्ट $PATHमें व्हाट्सएप या शेल ग्लोबिंग अक्षर होते हैं तो काम नहीं करेगा । read -rबैकस्लैश के साथ सामना करने के लिए आवश्यक है। यह एक अच्छी विधि नहीं है क्योंकि इसमें findएक लंबा समय लगेगा और अगर निर्देशिका में $PATHउपनिर्देशिका होती है तो यह शानदार मैच लौटा सकती है । सौभाग्य से, findयहाँ उपयोगी नहीं है; मेरा जवाब देखिए।
गिल्स एसओ- बुराई को रोकना '

मुझे पता था कि यह गलत लगा क्योंकि यह निश्चित रूप से नेस्टेड निर्देशिकाओं में धीमा होगा। $ 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" है, जो शेल में निर्मित है। whence -aक्या आप zsh के तहत चाहते हैं:

 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

मुझे कहना है, कि एक संभावित उपयोगी व्यवहार की तरह लगता है, भी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.