, ,

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