Sprawdzanie, czy klejnot ruby ​​jest zainstalowany ze skryptu bash

14

Muszę, na podstawie skryptu bash, sprawdzić, czy niektóre klejnoty Ruby są zainstalowane.

Myślałem, że mógłbym zrobić coś takiego

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

ale testowanie w wierszu poleceń za pomocą echo $?pokazuje, że gem list <name>zwraca 0, niezależnie od tego, czy faktycznie znaleziono nazwę.

Czy to oznacza, że ​​muszę używać grep do filtrowania wyników listy klejnotów, czy jest lepszy sposób, aby sprawdzić, czy klejnot jest zainstalowany?

Lee Lowder
źródło

Odpowiedzi:

26

gem list <name> -izwróci ciąg, truejeśli klejnot jest zainstalowany i falseinaczej. Kody zwrotne są również zgodne z oczekiwaniami.

Aby uzyskać więcej informacji, zobacz gem help list.


Edycja: @Riateche poprawnie zauważył, że może to dawać fałszywe alarmy, jeśli szukasz nazwy klejnotu, która jest podciągiem zainstalowanego inaczej klejnotu. Aby tego uniknąć, użyj składni wyrażenia regularnego:

gem list '^<name>$' -i

(Przykład:) gem list '^mini$' -i.

Sven
źródło
1
Aby sprawdzić, czy konkretna wersja jest zainstalowana, wystarczy dodać --versionnp gem list -i compass --version 0.12.4. : .
moeffju
6

Wygląda na to, że gem specpolecenie zakończy się niepowodzeniem z błędem, jeśli nazwany klejnot nie zostanie zainstalowany. Więc:

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

Nie wiem, czy jest to kanoniczny sposób rozwiązania tego problemu, ale działa.

Larsks
źródło
3

Możesz także użyć polecenia querypodrzędnego do gempolecenia.

$ gem query -i -n bundler 
true
fragment użycia
$ 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

Będzie również szukał konkretnych wersji, używając -vprzełącznika.

$ gem query -i -n bundler -v 1.6.2.1
false
slm
źródło
1
Przepraszamy za negatywną opinię, ale jak podano na stronie podręcznika dla gem query: „Polecenie zapytania jest podstawą poleceń listy i wyszukiwania. Naprawdę powinieneś użyć zamiast tego poleceń listy i wyszukiwania. To polecenie jest zbyt trudne w użyciu”. ... nie chcę tworzyć złych nawyków w społeczności SO! :-)
pvandenberk