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

286voto

ivant Points 1002

En général, cela dépend de votre shell, mais si vous utilisez bash, zsh, ksh ou sh (tel que fourni par dash), ce qui suit devrait fonctionner :

if ! type "$foobar_command_name" > /dev/null; then
  # install foobar here
fi

Pour une installation réelle script, vous voudriez probablement être sûr que type ne retourne pas avec succès dans le cas où il y a un alias foobar . En bash, vous pourriez faire quelque chose comme ceci :

if ! foobar_loc="$(type -p "$foobar_command_name")" || [[ -z $foobar_loc ]]; then
  # install foobar here
fi

1 votes

J'aime cette réponse. J'ai essayé de ne pas être trop influencé par l'image d'ivants que j'aime encore plus ;)

4 votes

Hmm...quand je le change pour dire if ! type "foo" > /dev/null; puis j'obtiens la sortie à l'écran "myscript.sh : line 12 : type : foo : not found", cependant, il semble toujours fonctionner parce que lorsque je dis if ! type "ls" > /dev/null; il n'y a pas de sortie et l'instruction if n'est pas exécutée (puisqu'elle renvoie true). Comment puis-je faire taire la sortie lorsque la commande n'existe pas ?

12 votes

Andrew, essaie if ! type "foo" > /dev/null 2>&1;

45voto

xuhdev Points 1130

Cinq façons, 4 pour bash et 1 addition pour zsh :

  • type foobar &> /dev/null
  • hash foobar &> /dev/null
  • command -v foobar &> /dev/null
  • which foobar &> /dev/null
  • (( $+commands[foobar] )) (zsh uniquement)

Vous pouvez mettre n'importe lequel d'entre eux à votre if clause. D'après mes tests ( https://www.topbug.net/blog/2016/10/11/speed-test-check-the-existence-of-a-command-in-bash-and-zsh/ ), les 1ère et 3ème méthodes sont recommandées dans bash et la 5ème méthode est recommandée dans zsh en termes de vitesse.

41voto

Foo Bah Points 11566

Essayez d'utiliser type :

type foobar

Par exemple :

$ type ls
ls is aliased to `ls --color=auto'

$ type foobar
-bash: type: foobar: not found

C'est préférable à which pour quelques raisons :

  1. La valeur par défaut which ne prennent en charge que l'option -a qui affiche toutes les options, vous devez donc trouver une version alternative pour supporter les alias.

  2. type vous dira exactement ce que vous regardez (que ce soit une fonction Bash, un alias ou un véritable binaire).

  3. type ne nécessite pas de sous-processus

  4. type ne peut pas être masqué par un binaire (par exemple, sur une machine Linux, si vous créez un programme appelé which qui apparaît dans le chemin avant le vrai which les choses se gâtent. type par contre, est une coquille intégrée (oui, un subordonné l'a fait par inadvertance une fois).

9 votes

Pourriez-vous formuler cela sous la forme d'une instruction if/else (qui ne s'affiche pas dans la console) ?

0 votes

Et sur certains Linux personnalisés, il n'y a pas de commande ''which''.

25voto

Dennis Points 5020

La question ne spécifie pas un shell, donc pour ceux qui utilisent poisson (shell interactif convivial) :

if command -v foo > /dev/null
  echo exists
else
  echo does not exist
end

Pour des raisons de compatibilité POSIX, nous utilisons l'option -v qui est un alias pour --search ou -s .

21voto

Morten Points 51

Vérifier si un programme existe à partir d'un script de Bash. couvre très bien ce sujet. Dans n'importe quel shell script, il vaut mieux exécuter command -v $command_name pour vérifier si $command_name peut être exécuté. Dans bash, vous pouvez utiliser hash $command_name qui hache également le résultat de toute recherche de chemin, ou bien type -P $binary_name si vous voulez seulement voir les binaires (pas les fonctions etc.)

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