Quelle est la commande unix pour savoir quel fichier exécutable correspond à une commande donnée?

22

Par exemple, s'il est passé lsen entrée, il devrait me dire qu'il /bin/lss'exécutera s'il est exécuté lssur la ligne de commande.

hugomg
la source

Réponses:

25

La commande à utiliser varie d'un shell à l'autre.

Seul un shell intégré indiquera correctement ce que le shell fera pour un nom de commande donné, car seuls les intégrés peuvent connaître pleinement les alias, les fonctions du shell, les autres intégrés, etc. N'oubliez pas: toutes les commandes ne correspondent pas en premier lieu aux fichiers exécutables.

  • Pour le shell Bourne Again bash, la fonction intégrée est la typecommande:

    $ type '['
    [ is a shell builtin
    
  • Pour la coquille de poissonfishtype ,, le builtin fonctionne de manière similaire à bash. Pour obtenir uniquement le chemin vers un exécutable, utilisez command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Pour le Korn Shell, ksh, le intégré est la whencecommande - avec d' typeabord mis en place comme un alias ordinaire whence -vet commandintégré avec l' -voption équivalente à whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Pour la Shell Z, zsh, le intégré est la whencecommande, avec l' commandintégré avec l' -voption équivalente à whenceet les built-ins type, whichet whereéquivalente à whenceavec les options -v, -cet -carespectivement.

    $ whence ls
    /bin/ls
    
  • Pour le shell TC tcsh, la commande intégrée est la whichcommande - à ne pas confondre avec une commande externe de ce nom:

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

Lectures complémentaires

JdeBP
la source
Notez que sous ksh, "type" est un alias par défaut pour "d'où -v" et peut donc être utilisé comme avec le shell bourne traditionnel et bash.
jlliagre
typeest également intégré à zsh?
Hongxu Chen,
RHEL6 dans lequel RPM (par exemple, which-2.19-6.el6.x86_64) place un fichier de démarrage /etc/profile.d/which2.sh. Ceci est lu par des shells non-csh, y compris zsh. Il alias whichà lui-même. Donc, pour les utilisateurs de zsh en particulier, il annule la fonction intégrée which.
Dan Pritts
14

Vous pouvez utiliser whichpour cela:

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

Il fonctionne en recherchant les PATHfichiers exécutables correspondant aux noms des arguments. Notez que cela ne fonctionne pas avec les alias de shell:

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, cependant, fonctionne:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
NPE
la source
3
Soyez prudent: si ls est une fonction ou a un alias, vous voulez 'taper ls' plutôt que 'which ls'
William Pursell
1
whichn'est pas nécessairement suffisant en soi. Il ne renvoie que le premier nom trouvé dans $ PATH ... Ce nom peut être un lien symbolique, et non l' exécutable de fin de chaîne réel .
Peter.O
8

whichne renvoie pas (nécessairement) le fichier exécutable. Il renvoie le premier nom de fichier correspondant qu'il trouve dans le $ PATH (ou plusieurs fichiers nommés similaires lors de l'utilisation which -a) ... L' exécutable réel peut être à plusieurs liens.

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

La commande qui trouve l' exécutable réel est readlink -e,
(en conjonction avec which)

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

Pour voir tous les liens intermédiaires :

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
Peter.O
la source
4

Tu peux essayer:

whereis ls

Ça me donne:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Ivan Morgillo
la source