Vérifier si une gemme rubis est installée à partir du script bash

14

Je dois, à partir d'un script bash, vérifier si certaines gemmes Ruby sont installées.

Je pensais pouvoir faire quelque chose comme

if ! gem list <name>; then do_stuff; fi

mais les tests sur la ligne de commande en utilisant echo $?montrent que gem list <name>renvoie 0, peu importe si le nom est réellement trouvé.

Est-ce que cela signifie que je dois utiliser grep pour filtrer la sortie de la liste des gemmes, ou existe-t-il une meilleure façon de vérifier si une gemme est installée?

Lee Lowder
la source

Réponses:

26

gem list <name> -iretournera la chaîne truesi la gemme est installée et falsesinon. De plus, les codes de retour sont ce que vous attendez.

Pour plus d'informations, voir gem help list.


Edit: @Riateche a correctement observé que cela pourrait donner de faux positifs si vous recherchez un nom de gemme qui est une sous-chaîne d'une gemme autrement installée. Pour éviter cela, utilisez une syntaxe regex:

gem list '^<name>$' -i

(Exemple:) gem list '^mini$' -i.

Sven
la source
1
Pour vérifier si une version spécifique est installée, il suffit d' ajouter --version, par exemple: gem list -i compass --version 0.12.4.
moeffju
6

Il semble que la gem speccommande échoue avec une erreur si la gemme nommée n'est pas installée. Donc:

if ! gem spec <name> > /dev/null 2>&1; then
  echo "Gem <name> is not installed!"
fi

Je ne sais pas si c'est la manière canonique de résoudre cela, mais cela fonctionne.

larsks
la source
3

Vous pouvez également utiliser la querysous-commande de la gemcommande.

$ gem query -i -n bundler 
true
extrait d'utilisation
$ gem help query
Usage: gem query [options]

  Options:
    -i, --[no-]installed             Check for installed gem
    -I                               Equivalent to --no-installed
    -v, --version VERSION            Specify version of gem to query
                                     for use with --installed
    -n, --name-matches REGEXP        Name of gem(s) to query on matches the
                                     provided REGEXP

Recherche également des versions spécifiques à l'aide du -vcommutateur.

$ gem query -i -n bundler -v 1.6.2.1
false
slm
la source
1
Toutes mes excuses pour le downvote, mais comme indiqué dans la page de manuel pour gem query: "La commande de requête est la base des commandes list et search. Vous devriez vraiment utiliser les commandes list et search à la place. Cette commande est trop difficile à utiliser." ... ne veux pas créer de mauvaises habitudes dans la communauté SO! :-)
pvandenberk