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

108

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 pour l'installation ou la maintenance du programme, et pour une autre magie d'automatisation contrôlée par les administrateurs système et amis.

Problème

Comment obtenir facilement le numéro de version d'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 à scénariser. Je n'ai pas trouvé de moyen d' erlexécuter une seule commande à partir d'une invite du shell.

Dossier 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 alternative pourrait également être de vérifier le chemin d'installation, mais ce n'est pas portable (mon chemin d'installation n'inclut pas la version, par exemple).

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

Eric Platon
la source
Qu'y a-t-il de si mauvais dans les communiqués? C'est trivialement analysé par Erlang :-)
Julian Fondren
Oups, rien de mal à ça! J'ai édité l'article pour le contexte. Je voulais dire analyser la chaîne Erlang avec des outils shell. Mon objectif est de script des tâches SA pour un package Erlang.
Eric Platon
Je ne comprends pas encore la syntaxe Erlang; Je veux juste vérifier si la version installée prend en charge Riak ou non. En mettant cela en vedette et en espérant qu'un jour Erlang fournira un moyen plus simple de signaler sa version aux administrateurs des outils qui en dépendent.
Iain Samuel McLean Elder
erl --version.
Michael Dimmitt

Réponses:

153
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Odobenus Rosmarus
la source
désolé je n'ai pas vu la réponse précédente plus complète quand je la poste
Odobenus Rosmarus
3
Cela s'imprime (no error logger present) error: "Error in process <0.0.0>sur Windows 7 pour moi. -1
Jonas
1
@andPat, votre suggestion renvoie la version du shell erlang pour moi (par exemple 7.0.2), pas erlang lui-même ( 18, dans mon cas).
gdw2 du
6
Extrait de la documentation pour erlang: system_info: A partir de OTP 17, le numéro de version OTP correspond au numéro de version OTP majeur. Pas d'argument erlang: system_info () donne la version exacte d'OTP. Voir ma réponse ci-dessous pour une commande encore plus laide qui imprime également une version mineure sur ma machine de développement.
Jay
2
Sous Windows 7, j'ai dû remplacer les guillemets simples par des guillemets doubles. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff
81

Les autres réponses affichent uniquement la version majeure à partir d'OTP 17 (à partir de la documentation 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 le fichier approprié, comme décrit dans la documentation .

Geai
la source
2
Merci, c'est utile! En outre, vous pouvez vous débarrasser des citations et \nainsi rendre le code plus court avec un seul changement: 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.
Dogbert
Sur Windows 7, j'ai dû échanger des guillemets simples avec des guillemets doubles (et vice versa). 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
yohosuff
38

(J'ajoute cette réponse ici car je l'ai recherchée au moins 3 fois au cours des trois derniers mois)

À 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.

Afin d'obtenir le numéro de version complet, il est nécessaire de vérifier le contenu du OTP_RELEASEfichier sous le releasesdossier déjà mentionné .

$ 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

ÉDITER

# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4
juan.facorro
la source
Je ne trouve pas ce fichier d'après votre description, find / -name "OTP_RELEASE"je ne le vois pas non plus, mais j'ai OTP 17.x installé. Comment puis-je savoir ce qu'est "x"?
NobbZ
1
@NobbZ J'ai mis à jour la réponse avec des informations supplémentaires, je viens de vérifier et dans la version actuelle d'Erlang / OTP que j'ai installée (17.4), le fichier est en fait appelé OTP_VERSION.
juan.facorro
1
avec une lignecat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0
14

init docs , lié par «man erl».

-eval Expr

Analyse, analyse 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'analyse ou exception lors de l'évaluation), Erlang s'arrête avec un message d'erreur. Voici un exemple qui amorce le générateur de nombres aléatoires:

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

Cet exemple utilise Erlang comme calculatrice hexadécimale:

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

Si plusieurs expressions -eval 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 fonction -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.

Donc,

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Julian Fondren
la source
Merci, Julian, pour le détail. Comment pourrais-je oublier de rechercher le evalmot - clé dans le manuel?
Eric Platon
12

Pour récupérer la version 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).


entrez la description de l'image ici

Miloud Eloumri
la source
2
La meilleure réponse, même si vous souhaiteriez que la version fonctionne.
Charlie
7

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

Sener DEMIRAL
la source
Cela fonctionne, oui. Identique à la section du fichier de version dans la question, le problème de votre proposition est qu'elle suppose la connaissance du chemin d'installation. L'avantage ici est d'obtenir la version complète. Pour moi: 18.2.1.
Eric Platon
Ce fichier n'existe pas sur CentOS 7
Eduardo Cuomo
/usr/lib/erlang/releases - installé via ansible
Olga
4

erl + V ou vous pouvez utiliser erl -version

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

shrikant
la source
5
Cela renvoie la erlversion de l' émulateur, pas le numéro de version de la version Erlang (par exemple "R15B03"). Tout cela pourrait être si simple ;-)
Eric Platon
2

Recherche l'ERL dans votre PATH et lit le fichier RELEASES pour extraire le numéro de version d'erlang.

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

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] [async-threads: 10] [kernel-poll: false] Eshell V5.10.4 (abandonner avec ^ G)

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

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

akhileshnair
la source
1

Sur la base de la réponse de Jay ci-dessus, j'ai écrit la fonction shell suivante que je peux utiliser:

erlang () {
    if [[ $@ == "-v" ]]; then
        command 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
    else
        command erl
    fi
}

J'oublie souvent que la commande est erlplutôt que erlang, donc cela permet à mon cerveau oublieux de l'utiliser erlangcomme si c'était le cas erl, et erlang -vcomme je m'attendrais à quelque chose comme elixir.

Josh Smith
la source
-6

Une commande simple que vous pouvez utiliser:

erl --version
Jérémie Ges
la source
2
Cette commande mène au shell. La question est de savoir comment obtenir simplement la version, pour le script.
Eric Platon