Tutoriel Linux

Quelle commande Linux sera réellement exécutée ?

Débutant4 min de lecture

Vous tapez python, ls ou grep, mais votre shell peut lancer autre chose que le binaire auquel vous pensez. Un alias, une fonction ou l’ordre de PATH suffit à changer le résultat. C’est particulièrement gênant dans une session d’administration où une commande personnalisée masque l’outil système.

Avant d’exécuter une commande sensible, vérifiez ce que votre shell résout réellement. command -v et type répondent à cette question mieux que which dans la plupart des cas.

Tux examine les chemins possibles d’une commande Linux
Alias, fonction ou binaire : le shell ne résout pas toujours une commande comme on l’imagine.

Commencez par command -v

La commande suivante affiche le nom, ou le chemin, que le shell utiliserait dans votre session actuelle :

command -v ls
command -v python
command -v cd

Pour un exécutable trouvé via PATH, vous obtenez en général un chemin comme /usr/bin/ls. Pour cd, Bash renvoie simplement cd car il s’agit d’une commande interne au shell. Si le nom est introuvable, la commande n’affiche rien et renvoie un code différent de zéro. Vous pouvez donc l’utiliser dans un script :

if command -v rsync >/dev/null 2>&1; then
  rsync --version
else
  printf '%sn' "rsync est absent"
fi

Cette forme évite de lancer which dans un script et fonctionne avec les shells POSIX. La spécification POSIX indique que command -v renseigne aussi les alias et les fonctions présents dans l’environnement courant.

Utilisez type quand le résultat semble suspect

type donne une réponse plus lisible pour un diagnostic interactif. Il vous dit si le nom est un alias, une fonction, une commande interne ou un fichier exécutable.

type ls
type cd
type -a python

L’option -a de Bash liste toutes les correspondances connues. C’est utile si plusieurs versions de Python sont installées ou si /usr/local/bin passe avant /usr/bin dans PATH.

Testez aussi un alias ou une fonction pour voir la différence :

alias ll='ls -alF'
type ll

sauvegarde() { tar -czf sauvegarde.tgz "$1"; }
type sauvegarde

Dans ce cas, il n’existe aucun binaire ll ou sauvegarde à retrouver sur le disque. Votre shell développe l’alias ou appelle la fonction avant de rechercher un fichier dans PATH.

Pourquoi which peut vous induire en erreur

which ls est pratique pour afficher un chemin rapidement, mais ce programme recherche surtout des exécutables dans PATH. Selon la distribution et le shell, il peut ignorer un alias, une fonction ou une commande interne. Il peut donc afficher /usr/bin/ls alors que votre session lance un alias ls --color=auto.

Gardez which pour une vérification rapide d’un fichier exécutable. Pour savoir ce que votre shell exécutera, lancez plutôt :

command -V ls
type -a ls

command -V fournit une description détaillée. C’est un bon point de départ avant de modifier un alias dans ~/.bashrc, d’ajouter un chemin dans PATH ou de lancer un script reçu d’un tiers.

Retrouver le fichier derrière le chemin

Quand command -v renvoie un chemin, contrôlez ensuite le lien symbolique et le type de fichier. Cette vérification évite de confondre un lanceur avec le vrai binaire :

bin=$(command -v python)
printf '%sn' "$bin"
readlink -f "$bin"
file "$(readlink -f "$bin")"

Ne faites ce test que si la sortie est un chemin. readlink -f cd n’a aucun sens, car cd est intégré au shell. Pour les fichiers et les scripts, vous pouvez compléter avec ls -l afin de voir le propriétaire et les droits. Le guide sur la commande cut peut ensuite vous aider à extraire une colonne précise d’une sortie texte, et journalctl après le dernier démarrage sert à vérifier ce qu’un service a réellement lancé.

Avant de corriger votre PATH

Affichez d’abord son contenu :

printf '%sn' "$PATH" | tr ':' 'n'

Un dossier placé au début gagne sur les suivants. Évitez d’ajouter . au début de PATH sur un serveur. Un fichier exécutable portant le même nom qu’une commande habituelle pourrait alors être lancé depuis le répertoire courant. Après une modification de profil shell, ouvrez une nouvelle session et refaites command -v puis type -a avant d’automatiser quoi que ce soit.

Pour aller plus loin, la documentation POSIX de command décrit le comportement de -v et -V, tandis que la page type(1p) détaille les catégories reconnues par le shell.

sudo apt update && sudo apt upgrade