我需要从 bash 脚本检查是否安装了某些 Ruby gem。
我以为我可以做类似的事情
if ! gem list <name>; then do_stuff; fi
但使用命令行进行测试echo $?
表明gem list <name>
无论是否实际找到名称都会返回 0。
这是否意味着我必须使用 grep 来过滤 gem 列表的输出,或者是否有更好的方法来检查 gem 是否已安装?
答案1
gem list <name> -i
true
如果 gem 已安装,则返回字符串,false
否则返回字符串。此外,返回代码也是您所期望的。
欲了解更多信息,请参阅gem help list
。
编辑:@Riateche正确观察到,如果您搜索的 gem 名称是已安装 gem 的子字符串,则可能会产生误报。为了避免这种情况,请使用正则表达式语法:
gem list '^<name>$' -i
(例子:gem list '^mini$' -i
)。
答案2
如果未安装指定的 gem,则命令似乎gem spec
会失败并出现错误。因此:
if ! gem spec <name> > /dev/null 2>&1; then
echo "Gem <name> is not installed!"
fi
我不知道这是否是解决这个问题的规范方法,但它确实有效。
答案3
您还可以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