Réponses:
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 type
commande:
$ type '['
[ is a shell builtin
Pour la coquille de poissonfish
type
,, 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 whence
commande - avec d' type
abord mis en place comme un alias ordinaire whence -v
et command
intégré avec l' -v
option équivalente à whence
:
$ whence -v ls
ls is a tracked alias for /bin/ls
Pour la Shell Z, zsh
, le intégré est la whence
commande, avec l' command
intégré avec l' -v
option équivalente à whence
et les built-ins type
, which
et where
équivalente à whence
avec les options -v
, -c
et -ca
respectivement.
$ whence ls
/bin/ls
Pour le shell TC tcsh
, la commande intégrée est la which
commande - à ne pas confondre avec une commande externe de ce nom:
> which ls
ls: aliased to ls-F
> which \ls
/bin/ls
type
est également intégré à zsh?
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
.
Vous pouvez utiliser which
pour cela:
aix@aix:~$ which ls
/bin/ls
Il fonctionne en recherchant les PATH
fichiers 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'
which
n'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 .
which
ne 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
Tu peux essayer:
whereis ls
Ça me donne:
ls: /bin/ls /usr/share/man/man1/ls.1.gz