web-dev-qa-db-fra.com

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

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

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

Ceci est utile pour écrire l’installation ou la maintenance du programme, ainsi que pour certains autres automatismes contrôlés de la part des administrateurs système et amis.

Problème

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

Sur le net

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

Emulateur

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

Difficile de faire un script. Je n'ai pas trouvé de moyen pour que 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}].

Paradis de l'analyse (avec Shell).

Une alternative pourrait également consister à 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

90
Eric Platon
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
129

Les autres réponses affichent uniquement la version majeure à partir de l’OTP 17 (à partir de docs pour erlang: system_info ). Cela fonctionne pour afficher les versions 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 dans le fichier approprié, comme décrit dans the docs .

50
Jay

(J'ajoute cette réponse ici puisque 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 principal. 

Pour obtenir le numéro de version complet, il est nécessaire de vérifier le contenu du fichier OTP_RELEASE dans le dossier releases 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

MODIFIER

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

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 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 calculatrice hexadécimale:

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

Si des expressions à niveaux multiples 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.

Ainsi,

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

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


 enter image description here

8
Miloud Eloumri

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

5
Sener DEMIRAL

erl + V ou vous pouvez utiliser erl -version

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

4
shrikant

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 erl plutôt que erlang, donc mon cerveau oublieux peut simplement utiliser erlang comme s'il s'agissait de erl, et erlang -v comme je l'attendrais de quelque chose comme elixir.

1
Josh Smith

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

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

Ouvrez le terminal et entrez la commande erl

Vous obtiendrez le résultat suivant:

Erlang R16B03 (erts-5.10.4) [source] [64 bits] [smp: 4: 4] [fils asynchrones: 10] [interrogation du noyau: false] Eshell V5.10.4 (abandonner avec ^ G)

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

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

1
akhileshnair

Une commande simple que vous pouvez utiliser:

erl --version
0
Jeremie Ges

Si vous avez rebar installé, procédez comme suit:

$ rebar3 --version

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

0
Ukr