Was ist der Unix-Befehl, um herauszufinden, welche ausführbare Datei einem bestimmten Befehl entspricht?


22

Wenn es zum Beispiel lsals Eingabe übergeben wird, sollte es mir mitteilen, dass es ausgeführt /bin/lswird, wenn es lsin der Befehlszeile ausgeführt wird.

Antworten:


25

Der zu verwendende Befehl variiert von Shell zu Shell.

Nur eine eingebaute Shell teilt einem korrekt mit, was die Shell für einen bestimmten Befehlsnamen tun wird, da nur eingebaute Shell-Funktionen, Aliase und andere eingebaute Shell-Funktionen usw. vollständig kennen. Denken Sie daran: Nicht alle Befehle entsprechen in erster Linie ausführbaren Dateien.

  • Für die Bourne Wieder Shell bash, die sich im internen ist der typeBefehl:

    $ type '['
    [ is a shell builtin
    
  • Für die Fish Shellfishtype funktioniert The builtin ähnlich wie bash. Um nur den Pfad zu einer ausführbaren Datei abzurufen, verwenden Sie command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Für die Korn - Shell ksh, die eingebaute in der ist whenceBefehl - mit typezunächst als gewöhnlicher Alias für einzurichten whence -vund die commandeingebaute mit der -vOption entspricht whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Für die Z - Shell, zsh, die eingebaute in der ist whenceBefehl, mit der commandeingebauten mit der -vOption entspricht whenceund die Einbauten type, whichund whereentspricht whencemit den Optionen -v, -cund -cajeweils.

    $ whence ls
    /bin/ls
    
  • Für den TC Shell tcsh, ist die eingebaute in dem whichBefehl - nicht mit einem externen Befehl mit diesem Namen verwechselt werden:

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

Weitere Lektüre


Beachten Sie, dass "type" unter ksh ein Standardalias für "whence -v" ist und daher genau wie bei der traditionellen Bourne-Shell und -Bash verwendet werden kann.
Juli

typeist auch in zsh eingebaut?
Hongxu Chen

RHEL6 gibt an, in welches RPM (z. B. which-2.19-6.el6.x86_64) eine Startdatei geschrieben wird /etc/profile.d/which2.sh. Dies wird von nicht-csh-Shells gelesen, einschließlich zsh. Es ist ein Alias whichfür sich. Insbesondere für zsh-Benutzer überschreibt es die eingebauten Funktionen which.
Dan Pritts

14

Sie können dafür verwenden which:

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

Es funktioniert, indem nach PATHausführbaren Dateien gesucht wird, die mit den Namen der Argumente übereinstimmen. Beachten Sie, dass dies nicht mit Shell-Aliasen funktioniert:

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:~$

typefunktioniert jedoch:

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

3
Seien Sie vorsichtig: Wenn ls eine Funktion ist oder ein Alias ​​ist, möchten Sie 'ls' anstatt 'which ls' eingeben
William Pursell

1
whichist nicht unbedingt genug für sich. Es wird nur der erste gefundene Name in $ PATH zurückgegeben ... Dieser Name ist möglicherweise ein symbolischer Link und nicht die eigentliche ausführbare Datei am Kettenende .
Peter.O

8

whichgibt die ausführbare Datei ( nicht unbedingt) zurück. Es gibt den ersten passende Datei Namen es in dem $ PATH findet (oder mehrere gleichnamigen Dateien bei der Verwendung which -a) ... Die tatsächliche ausführbare entfernt mehrere Links sein kann.

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

Der Befehl, der die eigentliche ausführbare Datei findet readlink -e, lautet
(in Verbindung mit which)

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

So zeigen Sie alle Zwischenlinks an :

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

4

Du kannst es versuchen:

whereis ls

Es gibt mir:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.