BASH: Vérifier qu’une commande existe
Comment vérifier qu’une commande existe en Bash ?
Comment vérifier la disponibilité des prérequis d’un script ?
Une méthode permettant de vérifier qu’une commande existe consiste à tester le retour de « command -v <commande_a_tester>
» :
fhh@mafalda ~ $ command -v ls alias ls='ls --color=auto' fhh@mafalda ~ $ echo $? 0 fhh@mafalda ~ $ command -v ls > /dev/null && echo "ls existe" ls existe
Si la commande existe et est accessible via le PATH ou au chemin spécifié, « command -v » retourne « 0 », sinon, le retour est supérieur à « 0 » :
fhh@mafalda ~ $ command -v youhou # youhou n'existe pas dans le PATH ou comme commande interne : fhh@mafalda ~ $ echo $? 1 fhh@mafalda ~ $ command -v ../../usr/bin/date # date est accessible au chemin spécifié : fhh@mafalda ~ $ echo $? 0
Vérifier les prérequis d’un script
Dans un script une manière de tester les prérequis (programmes nécessaires à l’exécution du code) consiste à placer la liste des dépendances dans une variable et à tester leur disponibilité. Ce qui peut donner une fonction du genre de « checkrequirements » :
#!/bin/bash _needed_commands="ls ps dhclient /sbin/dhclient ./montest.sh /bin/bash truc machin" ; checkrequirements () { command -v command >/dev/null 2>&1 || { echo "WARNING> \"command\" not found. Check requirements skipped !" return 1 ; } for requirement in ${_needed_commands} ; do echo -n "checking for \"$requirement\" ... " ; command -v ${requirement} > /dev/null && { echo "ok" ; continue ; } || { echo "required but not found !" ; _return=1 ; } done [ -z "${_return}" ] || { echo "ERR > Requirement missing." >&2 ; exit 1 ; } } checkrequirements |
qui donne à l’exécution :
fhh@mafalda ~ $ ./montest.sh checking for "ls" ... ok checking for "ps" ... ok checking for "dhclient" ... required but not found ! checking for "/sbin/dhclient" ... ok checking for "./montest.sh" ... ok checking for "/bin/bash" ... ok checking for "truc" ... required but not found ! checking for "machin" ... required but not found ! ERR > Requirement missing. fhh@mafalda ~ $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Note : Ligne 4, « dhclient
» est marqué comme non trouvé car il n’est pas dans les répertoires du PATH
de l’utilisateur. En revanche, en spécifiant le chemin complet vers le binaire (en absolu), ligne 5, la dépendance est trouvée. Ligne 6, on voit que les chemins peuvent être spécifié en relatif.
Plus d’infos sur « command
»
L’option « -v
», en minuscule, affiche :
- la commande seule s’il s’agit d’une commande interne ;
- le chemin absolu vers la commande si elle est dans le
PATH
ou relatif si elle à été précisée en relatif ; - la définition de l’alias s’il s’agit d’un alias ;
- …
L’option « -V
», en majuscule, affiche les mêmes informations que son homologue minuscule mais dans un format accès « lisibilité utilisateur » :
fhh@aaricia ~ $ command -V test test is a shell builtin fhh@aaricia ~ $ command -V date date is /usr/bin/date fhh@aaricia ~ $ command -V ../../usr/bin/date ../../usr/bin/date is ../../usr/bin/date fhh@aaricia ~ $ command -V ls ls is aliased to `ls --color=auto' fhh@aaricia ~ $ yop () { echo "Fonction yop" ;} yop is a function yop () { echo "Fonction yop" }
Notez le comportement de l’option sur une fonction …
L’option « -p
» execute la commande « originale » c’est à dire directement depuis le PATH
:
fhh@aaricia ~ $ alias date="date +%s" fhh@aaricia ~ $ date 1378889936 fhh@aaricia ~ $ command -p date Wed Sep 11 10:59:20 CEST 2013
Dans cet exemple, l’option « -p
» permet d’utiliser « date
» directement et non l’alias défini pour cette commande.
Note : dans cet exemple, « command -p date » équivaut à « \date ».