191 votes

Comment vérifier si une commande existe dans un shell script ?

Je suis en train d'écrire mon premier script. Dans mon script, je voudrais vérifier si une certaine commande existe, et si non, installer l'exécutable. Comment pourrais-je vérifier si cette commande existe ?

if # Check that foobar command doesnt exist
then
    # Now install foobar
fi

9 votes

Je suis tombé dessus par hasard. Je pense que c'est la même question que : stackoverflow.com/questions/592620/ mais il donne beaucoup plus de détails.

0 votes

@JerryTian merci pour le lien

2 votes

3voto

Tom Hale Points 5950

Une fonction qui fonctionne à la fois dans bash et zsh :

# Return the first pathname in $PATH for name in $1
function cmd_path () {
  if [[ $ZSH_VERSION ]]; then
    whence -cp "$1" 2> /dev/null
  else  # bash
     type -P "$1"  # No output if not in $PATH
  fi
}

Une valeur non nulle est renvoyée si la commande n'est pas trouvée dans le fichier $PATH .

1voto

mgild Points 586

Une fonction que j'ai dans une installation script faite exactement pour cela.

function assertInstalled() {
    for var in "$@"; do
        if ! which $var &> /dev/null; then
            echo "Install $var!"
            exit 1
        fi
    done
}

exemple d'appel :

assertInstalled zsh vim wget python pip git cmake fc-cache

0voto

thekashyap Points 1636

which <cmd>

voir aussi options which soutient pour les pseudonymes, si cela s'applique à votre cas.

Exemple

$ which foobar
which: no foobar in (/usr/local/bin:/usr/bin:/cygdrive/c/Program Files (x86)/PC Connectivity Solution:/cygdrive/c/Windows/system32/System32/WindowsPowerShell/v1.0:/cygdrive/d/Program Files (x86)/Graphviz 2.28/bin:/cygdrive/d/Program Files (x86)/GNU/GnuPG
$ if [ $? -eq 0 ]; then echo "foobar is found in PATH"; else echo "foobar is NOT found in PATH, of course it does not mean it is not installed."; fi
foobar is NOT found in PATH, of course it does not mean it is not installed.
$

PS : Notez que tout ce qui est installé ne se trouve pas forcément dans PATH. Habituellement, pour vérifier si quelque chose est "installé" ou non, il faut utiliser les commandes d'installation propres au système d'exploitation. Par exemple rpm -qa | grep -i "foobar" pour RHEL.

0 votes

which a également d'autres pièges

0 votes

Je commençais juste à lire man type pour voir comment c'est mieux peut-être pouvez-vous me faire gagner du temps en le postant ici :)

0 votes

Le vrai problème avec which est qu'il s'agit d'un externe et ne sera pas en mesure de gérer les spécificités des internes de la session shell actuelle, puisqu'il ne peut pas en avoir connaissance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X