Мне нужно из сценария 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