Überprüfen, ob ein Ruby Gem aus dem Bash-Skript installiert ist

14

Ich muss anhand eines Bash-Skripts überprüfen, ob bestimmte Ruby-Edelsteine ​​installiert sind.

Ich dachte, ich könnte so etwas tun

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

Das Testen in der Befehlszeile mit echo $?zeigt jedoch, dass gem list <name>0 zurückgegeben wird, unabhängig davon, ob der Name tatsächlich gefunden wurde.

Bedeutet dies, dass ich grep verwenden muss, um die Ausgabe der Gem-Liste zu filtern, oder gibt es eine bessere Möglichkeit, um zu überprüfen, ob ein Gem installiert ist?

Lee Lowder
quelle

Antworten:

26

gem list <name> -iGibt die Zeichenfolge zurück, truewenn der Edelstein installiert ist, und falseansonsten. Auch die Rückkehrcodes sind, was Sie erwarten würden.

Weitere Informationen finden Sie unter gem help list.


Edit: @Riateche hat richtig beobachtet, dass dies zu Fehlalarmen führen kann, wenn Sie nach einem Edelsteinnamen suchen, der eine Teilzeichenfolge eines ansonsten installierten Edelsteins ist. Um dies zu vermeiden, verwenden Sie eine reguläre Syntax:

gem list '^<name>$' -i

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

Sven
quelle
1
Um zu überprüfen , ob eine bestimmte Version installiert ist, fügen Sie einfach --version, zum Beispiel: gem list -i compass --version 0.12.4.
Moeffju
6

Es sieht so aus, als würde der gem specBefehl mit einem Fehler fehlschlagen, wenn der genannte Edelstein nicht installiert ist. So:

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

Ich weiß nicht, ob dies der kanonische Weg ist, dies zu lösen, aber es funktioniert.

larsks
quelle
3

Sie können auch den queryUnterbefehl zum gemBefehl verwenden.

$ gem query -i -n bundler 
true
Anwendungsauszug
$ 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

Sucht mithilfe des -vSchalters auch nach bestimmten Versionen .

$ gem query -i -n bundler -v 1.6.2.1
false
slm
quelle
1
Entschuldigung für die Ablehnung, aber wie in der Manpage für gem query"Der Abfragebefehl ist die Basis für die Listen- und Suchbefehle. Sie sollten stattdessen die Listen- und Suchbefehle verwenden. Dieser Befehl ist zu schwer zu verwenden." ... will keine schlechten Angewohnheiten in der SO-Community schaffen! :-)
pvandenberk