Назад | Перейти на главную страницу

Проверка, установлен ли рубиновый гем из сценария bash

Мне нужно из сценария bash проверить, установлены ли определенные драгоценные камни Ruby.

Я думал, что смогу сделать что-то вроде

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

но тестирование в командной строке с помощью echo $? показывает, что gem list <name> возвращает 0 независимо от того, действительно ли имя найдено.

Означает ли это, что мне нужно использовать grep для фильтрации вывода списка драгоценных камней, или есть лучший способ проверить, установлен ли драгоценный камень?

gem list <name> -i вернет строку true если драгоценный камень установлен и false в противном случае. Кроме того, коды возврата соответствуют вашим ожиданиям.

Для получения дополнительной информации см. gem help list.


Редактировать: @Riateche правильно заметил, что это может дать ложные срабатывания, если вы ищете имя драгоценного камня, которое является подстрокой другого установленного драгоценного камня. Чтобы этого избежать, используйте синтаксис регулярного выражения:

gem list '^<name>$' -i

(Пример: gem list '^mini$' -i).

Похоже, что gem spec команда завершится ошибкой, если именованный гем не установлен. Так:

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

Я не знаю, является ли это каноническим способом решения этой проблемы, но он работает.

Вы также можете использовать query подкоманда к gem команда.

$ gem query -i -n bundler 
true
отрывок из употребления
$ 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

Также будет искать конкретные версии, используя -v переключатель.

$ gem query -i -n bundler -v 1.6.2.1
false