{{tag>sysadmin bash cli}}
====== Bash : Retrouver le chemin complet de la commande ======
L' **expression** saisie par l'utilisateur est **évaluée** par le shell afin de déterminer la commande à invoquer. Les différents répertoires du **PATH** sont parcourus par le shell pour trouver la commande à exécuter. Les commandes **type**, **which**, **file** et **readlink** peuvent être utiles lorsque l'on souhaite identifier le fichier réellement exécuté par le shell :
Dans cet exemple l'utilisateur tape simplement ''python'' et valide. Un interpréteur Python est trouvé puis lancé par Bash:
python
Python 3.12.0 (main, Oct 21 2023, 17:44:38) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
On peut constater que c'est la version 3.12.0
La commande **type** avec l'option ''-t'' affiche le type de la commande passée en paramètre. Ce type peut valoir : "alias", "keyword", "function", "builtin", "file" ou "" si la commande est inconnue.
type -t python
file
Ici la commande 'python' correspond à un fichier externe. On peut afficher son chemin via l'option -p de **type** ou avec la commande **which** :
type -p python
/usr/bin/python
# Affiche toutes les correspondances
type -p -a python
/usr/bin/python
/bin/python
# Equivalent avec which
which python
/usr/bin/python
Ce fichier "/usr/bin/pyhton" peut être directement un exécutable ou un lien vers un autre lien ou fichier.
file /usr/bin/python
/usr/bin/python: symbolic link to /etc/alternatives/python
file /etc/alternatives/python
/etc/alternatives/python: symbolic link to /usr/bin/python3.12
file /usr/bin/python3.12
/usr/bin/python3.12: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=76fcae736cac0dd8e82f0e301fcd54545b0de609, for GNU/Linux 3.2.0, stripped
La commande **readlink** avec l'option ''-f'' permet de suivre chaque lien jusqu'au fichier final:
readlink -f /usr/bin/python
/usr/bin/python3.12
Dans notre exemple taper ''python'' est strictement équivalent à saisir ''/usr/bin/python3.12''.
On peut condenser cette recherche avec la commande suivante :
readlink -f $(which python)
===== Références =====
* [[https://stackoverflow.com/questions/2869100/how-to-find-directory-of-some-command|Retrouver le répertoire d'une commande (stackoverflow)]]