Je souhaite installer la dernière version stable de Ruby disponible avec rbenv . Cette fonctionnalité ne se produira pas dans Rbenv lui-même.
Lorsque j'exécute la commande rbenv install -l
dans mon shell, la liste des versions disponibles est longue. La liste contient tous les types d'entrées. Voici une liste partielle illustrant le format et la diversité:
$ rbenv install -l
Available versions:
2.0.0-p643
2.0.0-p645
2.1.0-dev
2.1.0-preview1
2.1.0-preview2
2.1.0-rc1
2.1.4
2.1.5
2.1.6
2.2.0-dev
2.2.0-preview1
2.2.0-preview2
2.2.0-rc1
2.2.0
2.2.1
2.2.2
2.3.0-dev
jruby-1.7.19
jruby-1.7.20
jruby-9.0.0.0-dev
jruby-9.0.0.0+graal-dev
jruby-9.0.0.0.pre1
jruby-9.0.0.0.pre2
maglev-1.0.0
maglev-1.1.0-dev
maglev-2.0.0-dev
mruby-dev
mruby-1.0.0
mruby-1.1.0
rbx-2.5.2
rbx-2.5.3
ree-1.8.7-2011.12
ree-1.8.7-2012.01
ree-1.8.7-2012.02
topaz-dev
Mon but est d'automatiser la commande rbenv install VERSION
dans un script Shell où VERSION
est la version la plus élevée de x.x.x
. En d'autres termes, je dois substituer automatiquement l'entrée la plus haute de la liste qui commence par un nombre et ne se termine pas par -something
dans VERSION
. De cette liste, j'ai besoin de 2.2.2
.
Que puis-je mettre dans mon script Shell pour choisir automatiquement la version la plus élevée de x.x.x
dans la commande rbenv install x.x.x
?
Edit: Comme Ruby n’est pas encore installé, la solution doit être en Bash et non en Ruby.
Edit 2: Je veux la version MRI (grand public) de Ruby.
rbenv install -l | awk -F '.' '
/^[[:space:]]*[0-9]+\.[0-9]+\.[0-9]+[[:space:]]*$/ {
if ( ($1 * 100 + $2) * 100 + $3 > Max ) {
Max = ($1 * 100 + $2) * 100 + $3
Version=$0
}
}
END { print Version }'
Si list est trié, un sed plus simple (version posix) suffit
rbenv install -l | sed -n '/^[[:space:]]*[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}[[:space:]]*$/ h;${g;p;}'
Solution simple (installe directement la dernière version stable):
rbenv install $(rbenv install -l | grep -v - | tail -1)
Explication:
rbenv install -l | grep -v - | tail -1
Filtre toutes les versions contenant un trait d'union -
, qui correspond à toutes les versions non-IRM et à la version préliminaire d'IRM. Ensuite, sélectionne le dernier, garanti comme étant le plus élevé, car la sortie de Ruby-build est déjà triée par ordre croissant de numéro de version.
Après de nombreux essais et erreurs, j'ai trouvé un moyen de récupérer la dernière version stable de cette liste. Ce n’est pas parfait car il ne fait que saisir le bon motif et la dernière version de celui-ci, mais il devrait faire son travail. Cela fonctionnera tant que les versions sont en ordre.
Cela produira 2.2.2
rbenv install -l | grep -P "^ [[:digit:]]\.[[:digit:]]\.[[:digit:]]$" | tail -1
Nous pouvons brancher ce résultat dans rbenv install
comme ceci:
rbenv install $(rbenv install -l | grep -P "^ [[:digit:]]\.[[:digit:]]\.[[:digit:]]$" | tail -1)
La mienne est similaire à la réponse d'Anonymous (mais plus courte parce que j'utilise\d).
rbenv install -l| grep -P "\s2.*(\.|\d)\d$" | tail -1
Je voulais spécifier le dernier jruby, c'est pourquoi j'ai utilisé un "2" pour pouvoir remplacer le 2 par "jruby":
rbenv install -l| grep -P "\sjruby.*(\.|\d)\d$"|tail -1
Vous pouvez remplacer jruby par d'autres chaînes pour obtenir différents types de Ruby, par exemple. rbx, mruby.