Checking if a ruby gem is installed from bash script
I need to, from a bash script, check to see if certain Ruby gems are installed .
I thought I could do something like
if ! gem list <name>; then do_stuff; fi
but testing on the command line using echo $?
shows that gem list <name>
returns 0 regardless of if name is actually found.
Does this mean I have to use grep to filter the output of gem list, or is there a better way I can check to see if a gem is installed?
gem list <name> -i
will return the string true
if the gem is installed and false
otherwise. Also, the return codes are what you would expect.
For more informations, see gem help list
.
Edit: @Riateche correctly observed that this might give false positives if you search for a gem name that is a substring of an otherwise installed gem. To avoid this, use a regex syntax:
gem list '^<name>$' -i
(Example: gem list '^mini$' -i
).
It looks as if the gem spec
command will fail with an error if the named gem is not installed. So:
if ! gem spec <name> > /dev/null 2>&1; then
echo "Gem <name> is not installed!"
fi
I don't know if this is the canonical way of solving this, but it works.
You can also use the query
sub-command to the gem
command.
$ gem query -i -n bundler
true
usage excerpt
$ 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
Will also look for specific versions as well, using the -v
switch.
$ gem query -i -n bundler -v 1.6.2.1
false