Memeriksa apakah permata ruby ​​diinstal dari skrip bash

14

Saya perlu, dari skrip bash, memeriksa untuk melihat apakah permata Ruby tertentu diinstal.

Saya pikir saya bisa melakukan sesuatu seperti

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

tetapi pengujian pada baris perintah menggunakan echo $?menunjukkan yang gem list <name>mengembalikan 0 terlepas dari apakah nama sebenarnya ditemukan.

Apakah ini berarti saya harus menggunakan grep untuk memfilter keluaran daftar permata, atau adakah cara yang lebih baik untuk memeriksa apakah permata diinstal?

Lee Lowder
sumber

Jawaban:

26

gem list <name> -iakan mengembalikan string truejika permata diinstal dan falsesebaliknya. Juga, kode kembali adalah apa yang Anda harapkan.

Untuk informasi lebih lanjut, lihat gem help list.


Sunting: @Riateche mengamati dengan benar bahwa ini mungkin memberikan positif palsu jika Anda mencari nama permata yang merupakan substring dari permata yang dipasang lain. Untuk menghindari ini, gunakan sintaks regex:

gem list '^<name>$' -i

(Contoh:) gem list '^mini$' -i.

Sven
sumber
1
Untuk memeriksa apakah versi tertentu terinstal, tambahkan saja --version, misalnya: gem list -i compass --version 0.12.4.
moeffju
6

Tampaknya seolah-olah gem specperintah akan gagal dengan kesalahan jika permata bernama tidak diinstal. Begitu:

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

Saya tidak tahu apakah ini cara kanonik untuk menyelesaikan ini, tetapi ini berhasil.

larsks
sumber
3

Anda juga dapat menggunakan querysub-perintah untuk gemperintah.

$ gem query -i -n bundler 
true
kutipan penggunaan
$ 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

Juga akan mencari versi tertentu, menggunakan -vsakelar.

$ gem query -i -n bundler -v 1.6.2.1
false
slm
sumber
1
Permintaan maaf untuk downvote, tetapi sebagaimana dinyatakan dalam halaman manual untuk gem query: "Perintah permintaan adalah dasar untuk daftar dan perintah pencarian. Anda harus benar-benar menggunakan daftar dan mencari perintah saja. Perintah ini terlalu sulit untuk digunakan." ... tidak ingin membuat kebiasaan buruk di komunitas SO! :-)
pvandenberk