Comment vérifier si une commande existe dans Bash

Les scripts dépendent souvent d’outils tels que git, curl, jqou docker. Si l’une de ces commandes est manquante, Bash échoue généralement plus tard avec command not foundce qui peut être difficile à diagnostiquer si le script a déjà créé des fichiers, modifié des répertoires ou démarré une étape de déploiement.

Une petite vérification des dépendances en haut du script vous donne un chemin d’échec plus propre. Vous pouvez imprimer une erreur utile, quitter avec un statut différent de zéro ou installer le package manquant dans des scripts d’installation destinés à gérer la machine locale.

Ce guide montre le fiable command -v modèle, comment capturer le chemin résolu et quand des alternatives telles que type, hashet which avoir du sens.

Pour les scripts, la méthode par défaut la plus sûre est d’exécuter command -v et testez son statut de sortie :

merde

if command -v git >/dev/null 2>&1; then
 echo "git is available"
else
 echo "git is not installed" >&2
 exit 1
fi

command -v NAME sort avec le statut 0 quand le shell peut résoudre NAME comme une commande. Si le nom n’est pas trouvé, il sort avec un statut différent de zéro. Rediriger à la fois stdout et stderr vers /dev/null masque le chemin résolu ou le message de recherche, de sorte que la vérification reste silencieuse sauf si vous imprimez votre propre erreur.

Dans Bash, command -v peut trouver des exécutables sur PATHles éléments intégrés du shell, les fonctions et les mots-clés du shell. Il peut également signaler les alias dans les shells où l’expansion des alias est activée, mais les scripts ne doivent pas traiter les alias comme des dépendances requises. Vérifiez la commande réelle que votre script exécutera.

Capturez le chemin

Lorsque vous avez besoin du chemin de commande résolu plus tard dans le script, attribuez la sortie à l’intérieur du if condition:

merde

if git_bin=$(command -v git); then
 echo "git found at: $git_bin"
else
 echo "git is required but was not found" >&2
 exit 1
fi

Pour les programmes externes, la variable contient le chemin que Bash a trouvé via PATHtel que /usr/bin/git. Pour les éléments intégrés et les fonctions, command -v peut renvoyer le nom de la commande au lieu d’un chemin du système de fichiers.

Ce modèle maintient le chèque et la mission liés ensemble. Évitez d’attribuer d’abord et de vérifier uniquement si la variable n’est pas vide, car l’état de sortie vous indique exactement si la recherche a réussi.

Vérifier plusieurs commandes

Lorsqu’un script dépend de plusieurs programmes externes, validez-les tous avant d’effectuer toute intervention. Dans un script Bash, un tableau garde la liste des commandes claire :

merde

required_commands=(git curl jq)
missing_commands=()

for cmd in "${required_commands(@)}"; do
 if ! command -v "$cmd" >/dev/null 2>&1; then
 missing_commands+=("$cmd")
 fi
done

if ((${#missing_commands(@)} > 0)); then
 printf 'Error: missing required commands: %s\n' "${missing_commands(*)}" >&2
 exit 1
fi

La boucle enregistre chaque commande manquante, puis les imprime sur une seule ligne stderr avec >&2. Le ${missing_commands(*)} l’expansion joint les noms avec un espace, de sorte que toutes les dépendances manquantes apparaissent dans un seul message. Quitter avant le début des travaux principaux empêche les exécutions partielles et donne aux appelants un statut d’échec clair. Pour en savoir plus sur les valeurs de sortie, consultez le guide du code de sortie Bash.

Installer une commande manquante

Pour les scripts d’installation locaux, vous souhaiterez peut-être installer une dépendance lorsqu’elle est manquante. Sur Ubuntu, Debian et leurs dérivés, le modèle ressemble à ceci :

merde

if ! command -v jq >/dev/null 2>&1; then
 echo "jq not found, installing..."
 sudo apt update
 sudo apt install -y jq
fi

Utilisez la logique d’installation automatique uniquement dans les scripts pour lesquels une modification du système est attendue, comme un script d’amorçage pour une machine ou un serveur de développement. Pour les scripts à usage général, imprimez la dépendance manquante et laissez l’utilisateur décider comment l’installer.

Alternative : tapez

type est un composant intégré de Bash qui montre comment un nom de commande sera interprété :

merde

if type git >/dev/null 2>&1; then
 echo "git is available"
fi

Cela se comporte de la même manière que command -v pour un contrôle d’existence de base, mais type est principalement utile lorsque vous souhaitez obtenir une explication pour une personne. Par exemple, il peut indiquer si un nom est un fichier intégré, une fonction, un alias, un mot-clé ou un fichier exécutable.

Si vous avez spécifiquement besoin d’un fichier exécutable sur PATH dans Bash, utilisez type -P:

merde

if type -P git >/dev/null 2>&1; then
 echo "git executable found"
fi

Le type La commande est utile pour déboguer la résolution du nom du shell. Pour un examen plus approfondi de ses options, consultez le guide des commandes de type .

Alternative : le hachage

hash est un autre composant intégré de Bash qui peut résoudre les noms de commandes et mémoriser les chemins d’exécution dans la table de hachage du shell :

merde

if hash git 2>/dev/null; then
 echo "git is available"
fi

Cela peut fonctionner pour des vérifications rapides uniquement avec Bash, mais c’est moins clair que command -v et ce n’est pas le meilleur modèle à usage général. Ne pas utiliser hash -t name comme première recherche, parce que -t imprime une entrée uniquement après que la commande a déjà été hachée dans le shell actuel.

Utiliser command -v sauf si vous avez spécifiquement besoin d’inspecter ou de gérer la table de hachage des commandes de Bash.

Pourquoi pas lequel

which est courant dans l’utilisation des terminaux interactifs, mais ce n’est pas le meilleur choix dans les scripts :

merde

# Avoid this in scripts
if which git >/dev/null 2>&1; then
 echo "git found"
fi

Contrairement à command -v, which est généralement un programme externe et n’est pas standardisé par POSIX. Son comportement et sa sortie peuvent varier selon les systèmes, et ils peuvent ne pas refléter les fonctions, les fonctions intégrées ou les alias de Bash de la même manière que le shell.

Utiliser which lorsque vous tapez à une invite et que vous souhaitez uniquement une recherche rapide du chemin. Utiliser command -v lorsque le résultat contrôle la logique du script.

Référence rapide

Tâche Modèle
Vérifier si une commande existe command -v name >/dev/null 2>&1
Chèque et succursale if command -v name >/dev/null 2>&1; then ... fi
Capturez le chemin résolu if name_bin=$(command -v name); then ... fi
Vérifiez plusieurs commandes dans Bash for c in git curl jq; do command -v "$c"; done
Erreurs de dépendance d’impression echo "missing command" >&2
Rechercher un fichier exécutable dans Bash type -P name >/dev/null 2>&1
À éviter pour la logique du script which name

Conclusion

Utiliser command -v au début des scripts Bash qui dépendent de programmes externes, puis échouent prématurément avec un message stderr clair lorsqu’une dépendance est manquante. Pour des garde-fous de script plus larges, consultez notre guide des meilleures pratiques Bash.