यूनिक्स कमांड क्या पता लगाने के लिए कि निष्पादन योग्य फ़ाइल किसी दिए गए कमांड से मेल खाती है?


22

उदाहरण के लिए, यदि lsइनपुट के रूप में पारित किया गया है तो मुझे यह बताना चाहिए कि कमांड-लाइन पर /bin/lsचलने lsपर क्या होगा ।

जवाबों:


25

उपयोग करने का कमांड शेल से शेल में भिन्न होता है।

केवल एक शेल बिल्ट-इन एक सही ढंग से बताएगा कि शेल किसी दिए गए कमांड नाम के लिए क्या करेगा, क्योंकि केवल बिल्ट-इन पूरी तरह से उपनाम, शेल फ़ंक्शन, अन्य निर्मित-इन और आगे के बारे में जान सकता है। याद रखें: पहली बार में सभी कमांड निष्पादन योग्य फ़ाइलों के अनुरूप नहीं हैं।

  • बॉर्न फिर खोल के लिए, bash, बिल्ट-इन है typeआदेश:

    $ type '['
    [ is a shell builtin
    
  • मछली के खोल के लिएfish , द typeबिलिन इसी तरह से काम करता है। एक निष्पादन योग्य के लिए सिर्फ रास्ता पाने के लिए, उपयोग करें command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • कॉर्न शैल के लिए, ksh, बिल्ट-इन है whenceआदेश - साथ typeशुरू में के लिए एक साधारण उपनाम के रूप में की स्थापना की whence -vऔर commandबिल्ट-इन के साथ -vकरने के लिए विकल्प के बराबर whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • जेड शैल के लिए, zsh, बिल्ट-इन है whenceआदेश, साथ commandमें निर्मित के साथ -vकरने के लिए विकल्प बराबर whenceऔर निर्मित-इन type, whichऔर whereके बराबर whenceविकल्पों के साथ -v, -c, और -caक्रमशः।

    $ whence ls
    /bin/ls
    
  • टीसी शेल के लिए tcsh, बिल्ट-इन है whichआदेश - उस नाम से किसी भी बाहरी कमांड के साथ भ्रमित होने की नहीं:

    > which ls
    ls: aliased to ls-F
    > which \ls
    /bin/ls
    

आगे की पढाई


ध्यान दें कि ksh के तहत, "प्रकार" "व्हेंस -v" के लिए एक डिफ़ॉल्ट उपनाम है, इसलिए इसे पारंपरिक बोर्न शेल और बैश के साथ उपयोग किया जा सकता है।
jlliagre

typeभी zsh करने के लिए बनाया गया है?
होंग्क्सू चेन

RHEL6 की कौन सी RPM (जैसे which-2.19-6.el6.x86_64) एक स्टार्टअप फ़ाइल में डालता है /etc/profile.d/which2.sh। यह गैर-शेश गोले द्वारा पढ़ा जाता है, जिसमें zsh भी शामिल है। यह whichखुद पर निर्भर करता है। तो zsh उपयोगकर्ताओं के लिए विशेष रूप से यह ओवरराइड करता है बिलिन को तोड़ता है which
दान प्रिट्स

14

आप इसके लिए उपयोग कर सकते हैं which:

aix@aix:~$ which ls
/bin/ls

यह PATHतर्कों के नाम से मेल खाती निष्पादन योग्य फ़ाइलों की खोज करके काम करता है । ध्यान दें कि शेल उपनामों के साथ काम नहीं करता है:

aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin    dev   initrd.img      lib32   media  proc  selinux  tmp  vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$

typeहालांकि, काम करता है:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'

3
सावधान रहें: यदि ls एक फ़ंक्शन है या अलियासिड है, तो आप 'किस ls' के बजाय 'टाइप ls' चाहते हैं
विलियम पर्ससेल

1
whichजरूरी नहीं कि यह अपने आप में पर्याप्त हो। यह केवल $ PATH में पहला पाया गया नाम देता है ... यह नाम प्रतीकात्मक लिंक हो सकता है, कि वास्तविक अंतिम-श्रृंखला निष्पादन योग्य।
पीटर.ऑक्ट

8

which(आवश्यक) निष्पादन योग्य फ़ाइल वापस नहीं करता है । यह पहली मिलान फ़ाइल का नाम देता है जो $ PATH में मिलती है (या उपयोग करते समय कई नामी फ़ाइलों की तरह which -a) ... वास्तविक निष्पादन योग्य कई लिंक दूर हो सकता है।

  • which locate
    /usr/bin/locate
    `
  • file $(which locate)
    /usr/bin/locate: symbolic link to /etc/alternatives/locate'

जो कमांड वास्तविक निष्पादन योग्य है readlink -e, वह है
(साथ में which)

  • readlink -e $(which locate)
    /usr/bin/mlocate

सभी मध्यवर्ती लिंक देखने के लिए :

f="$(which locate)"             # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do  # follow links to executable
    printf "# %s\n" "$f"
done

# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate

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