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.
_ {Comment obtenir facilement le numéro de version pour Erlang (OTP)} _?
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é.
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
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 .
(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
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
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).
Trouver dans /usr/lib/erlang/releases/18/OTP_VERSION
erl + V ou vous pouvez utiliser erl -version
résultat: Erlang (SMP, ASYNC_THREADS) (BEAM) émulateur version 5.8.5
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
.
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"
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
Une commande simple que vous pouvez utiliser:
erl --version
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