Comment obtenir le numéro de version de Erlang à partir d’un shell?

De nombreux programmes renvoient leur numéro de version avec une commande comme:

$ program --version program (platform info) v1.2.3 

Ceci est utile pour créer des scripts sur l’installation ou la maintenance du programme, ainsi que sur d’autres techniques automatisées contrôlées par les administrateurs système et les amis.

Problème

Comment obtenir facilement le numéro de version pour Erlang (OTP) ?

Sur le net

Voici quelques solutions insatisfaisantes ([1] et autres tutoriels / documentation Erlang):

Émulateur

 $ erl 1> erlang:system_info(otp_release). "R13B03" 

Difficile à écrire Je n’ai pas trouvé de moyen pour erl exécute une seule commande à partir d’une invite du shell.

Fichier de sortie

 $ cat /usr/lib/erlang/releases/RELEASES [{release,"OTP APN 181 01","R13B03","5.7.4", [{kernel,"2.13.4","/usr/lib/erlang/lib/kernel-2.13.4"}, {stdlib,"1.16.4","/usr/lib/erlang/lib/stdlib-1.16.4"}, {sasl,"2.1.8","/usr/lib/erlang/lib/sasl-2.1.8"}], permanent}]. 

Parsing paradise (avec shell).

Une autre solution consisterait peut-être à vérifier le chemin d’installation, mais ce n’est pas portable (mon chemin d’installation n’inclut pas la version).

Contexte personnel: J’écris un script pour installer la même version de RabbitMQ avec des plugins sur plusieurs machines. Certains plugins ont des exigences minimales sur la version OTP, et c’est ainsi que cette question a commencé.

[1] http://forum.trapexit.org/viewtopic.php?p=42946

  erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell 

Les autres réponses affichent uniquement la version majeure à partir d’OTP 17 (à partir de docs pour erlang: system_info ). Cela fonctionne pour afficher la version majeure et mineure sur ma machine de développement:

 erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell 

Cela lit à partir du fichier approprié, comme décrit dans les documents .

(J’ajoute cette réponse ici depuis au moins trois fois ces trois derniers mois)

A partir de la version 17.0, les versions ont un nouveau format dans leur numéro de version (17.0, 17.1, …) mais erlang:system_info(otp_release). ne renvoie que le numéro de version majeur.

Pour obtenir le numéro de version complet, il est nécessaire de vérifier le contenu du fichier OTP_RELEASE dans le dossier des releases déjà mentionnées.

 $ which erl /usr/bin/erl $ cd /usr/bin $ ls -l erl ../lib/erlang/bin/erl $ cd ../lib/erlang/ $ cat releases/17/OTP_RELEASE 17.3 

MODIFIER

 # Some versions seem to have OTP_VERSION instead of OTP_RELEASE $ cat releases/17/OTP_VERSION 17.4 

init docs , lié par ‘man erl’.

Expr

Analyse, parsing et évalue une expression arbitraire Expr lors de l’initialisation du système. Si l’une de ces étapes échoue (erreur de syntaxe, erreur d’parsing ou exception lors de l’évaluation), Erlang s’arrête avec un message d’erreur. Voici un exemple qui génère le générateur de nombres aléatoires:

 % erl -eval '{X,Y,Z} = now(), random:seed(X,Y,Z).' 

Cet exemple utilise Erlang comme calculasortingce hexadécimale:

 % erl -noshell -eval 'R = 16#1F+16#A0, io:format("~.16B~n", [R])' -s erlang halt BF 

Si des expressions à plusieurs niveaux sont spécifiées, elles sont évaluées séquentiellement dans l’ordre spécifié. Les expressions -eval sont évaluées séquentiellement avec les appels de fonctions -s et -run (ceci également dans l’ordre spécifié). Comme avec -s et -run, une évaluation qui ne se termine pas bloque le processus d’initialisation du système.

Ainsi,

 $ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt 

Pour récupérer la version d’EShell (Erlang Shell), vous pouvez utiliser:

 erlang:system_info(version). 

et pour récupérer la version Erlang OTP ( Open Telecom Platform ):

 erlang:system_info(otp_release). 

entrer la description de l'image ici

Rechercher dans /usr/lib/erlang/releases/18/OTP_VERSION

erl + V ou vous pouvez utiliser erl -version

résultat: émulateur Erlang (SMP, ASYNC_THREADS) (BEAM) version 5.8.5

Trouve le erl dans votre PATH et lit le fichier RELEASES pour extraire le numéro de version erlang.

 awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES" 

Ouvrez le terminal et entrez la commande erl

Vous obtiendrez la sortie suivante:

Erlang R16B03 (erts-5.10.4) [source] [64 bits] [smp: 4: 4] [threads asynchrones: 10] [sondage-kernel: false] Eshell V5.10.4 (abandon avec ^ G)

Erlang R16B03 (erts-5.10.4) [source] [64 bits] [smp: 4: 4] [threads asynchrones: 10] [kernel-poll: false] – Ceci est la version linguistique

Eshell V5.10.4 (abandonner avec ^ G) – Ceci est la version du shell

Une commande simple que vous pouvez utiliser:

 erl --version 

Si vous avez installé des barres d’ armature, faites ceci:

 $ rebar3 --version 

résultat: rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5