Como obter o número da versão de lançamento do Erlang de um shell?

108

Muitos programas retornam seu número de versão com um comando como:

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

Isso é útil para criar scripts de instalação ou manutenção do programa e alguma outra mágica de automação controlada de Administradores de sistema e amigos.

Problema

Como obter facilmente o número da versão do Erlang (OTP) ?

Na rede

Aqui estão algumas soluções insatisfatórias ([1] e outros tutoriais / documentação Erlang):

Emulador

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

Difícil de escrever. Não encontrei uma maneira de erlexecutar um único comando em um prompt de shell.

Arquivo de lançamento

$ 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}].

Analisando o paraíso (com casca).

Uma alternativa também poderia ser verificar o caminho de instalação, mas isso não é portátil (meu caminho de instalação não inclui a versão, por exemplo).

Contexto pessoal: Estou escrevendo um script para instalar a mesma versão do RabbitMQ com plug-ins em várias máquinas. Alguns plug-ins têm requisitos mínimos na versão OTP, e foi assim que esta questão começou.

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

Eric Platon
fonte
O que há de tão ruim em RELEASES? É analisado trivialmente por Erlang :-)
Julian Fondren
Opa, nada de ruim com isso! Eu editei a postagem para o contexto. Eu quis dizer analisar a string Erlang com ferramentas de shell. Meu objetivo é criar scripts de tarefas SA para um pacote Erlang.
Eric Platon,
Eu não entendo a sintaxe Erlang ainda; Eu só quero verificar se a versão instalada suporta Riak ou não. Estrelando isso e esperando que um dia Erlang forneça uma maneira mais simples de relatar sua versão para administradores de ferramentas que dependem dele.
Iain Samuel McLean Ancião
erl - versão.
Michael Dimmitt

Respostas:

153
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Odobenus Rosmarus
fonte
desculpe, não vi uma resposta anterior mais abrangente quando postá-la
Odobenus Rosmarus
3
Isso imprime (no error logger present) error: "Error in process <0.0.0>no Windows 7 para mim. -1
Jonas
1
@andPat, sua sugestão retorna a versão do shell erlang para mim (por exemplo 7.0.2), não o próprio erlang ( 18no meu caso).
gdw2
6
Dos documentos para erlang: system_info: A partir do OTP 17, o número da versão OTP corresponde ao número da versão principal do OTP. Nenhum argumento erlang: system_info () fornece a versão OTP exata. Veja minha resposta abaixo para um comando ainda mais feio que também imprime uma versão secundária em minha máquina de desenvolvimento.
Jay
2
No Windows 7, tive que substituir as aspas simples por aspas duplas. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff
81

As outras respostas exibem apenas a versão principal a partir do OTP 17 (de documentos para erlang: system_info ). Isso funciona para exibir a versão principal e secundária na minha máquina de desenvolvimento:

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

Ele é lido do arquivo apropriado, conforme descrito nos documentos .

Jay
fonte
2
Obrigado, isso é útil! Além disso, você pode se livrar das cotações e \ne também tornar o código mais curto, com apenas uma mudança: 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,
No Windows 7, tive que trocar aspas simples por aspas duplas (e 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

(Estou adicionando esta resposta aqui, pois pesquisei isso pelo menos 3 vezes nos últimos três meses)

A partir da versão 17.0, os lançamentos têm um novo formato em seu número de versão (17.0, 17.1, ...), mas erlang:system_info(otp_release).retorna apenas o número da versão principal.

Para obter o número completo da versão, é necessário verificar o conteúdo do OTP_RELEASEarquivo na releasespasta já mencionada .

$ 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

EDITAR

# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4
juan.facorro
fonte
Não encontrei esse arquivo pela sua descrição, find / -name "OTP_RELEASE"também não o vejo, mas tenho o OTP 17.x instalado. Como posso saber o que é "x"?
NobbZ de
1
@NobbZ Atualizei a resposta com informações adicionais, acabei de verificar e na versão Erlang / OTP atual que instalei (17.4) o arquivo é realmente chamado OTP_VERSION.
juan.facorro de
1
com uma linhacat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0
14

documentos do init , vinculados por 'man erl'.

-eval Expr

Verifica, analisa e avalia uma expressão arbitrária Expr durante a inicialização do sistema. Se alguma dessas etapas falhar (erro de sintaxe, erro de análise ou exceção durante a avaliação), Erlang para com uma mensagem de erro. Aqui está um exemplo que semeia o gerador de número aleatório:

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

Este exemplo usa Erlang como calculadora hexadecimal:

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

Se várias expressões -eval forem especificadas, elas serão avaliadas sequencialmente na ordem especificada. As expressões -eval são avaliadas sequencialmente com chamadas de função -s e -run (isso também na ordem especificada). Como com -s e -run, uma avaliação que não termina, bloqueia o processo de inicialização do sistema.

Portanto,

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Julian Fondren
fonte
Obrigado, Julian, pelo detalhe. Como posso esquecer de pesquisar a evalpalavra - chave no manual?
Eric Platon,
12

Para recuperar a versão EShell (Erlang Shell), você pode usar:

erlang:system_info(version).

e para recuperar a versão Erlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


insira a descrição da imagem aqui

Miloud Eloumri
fonte
2
A melhor resposta. Embora você deseje --version funcionaria.
Charlie
7

Encontre em /usr/lib/erlang/releases/18/OTP_VERSION

Sener DEMIRAL
fonte
Isso funciona, sim. Da mesma forma que a seção do arquivo de liberação na questão, o problema da sua proposta é que ela assume o conhecimento do caminho de instalação. O benefício aqui é obter a versão completa. Para mim: 18.2.1.
Eric Platon
Este arquivo não existe no CentOS 7
Eduardo Cuomo
/usr/lib/erlang/releases - instalado via ansible
Olga
4

erl + V ou você pode usar erl -version

resultado: emulador Erlang (SMP, ASYNC_THREADS) (BEAM) versão 5.8.5

Shrikant
fonte
5
Isso retorna a erlversão do emulador, não o número da versão do Erlang (por exemplo, "R15B03"). Tudo isso poderia ser tão fácil ;-)
Eric Platon
2

Encontra o erl em seu PATH e lê o arquivo RELEASES para extrair o número da versão erlang.

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

Abra o terminal e digite o comando erl

Você obterá a seguinte saída:

Erlang R16B03 (erts-5.10.4) [fonte] [64 bits] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] Eshell V5.10.4 (abortar com ^ G)

Erlang R16B03 (erts-5.10.4) [fonte] [64 bits] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] - Esta é a versão do idioma

Eshell V5.10.4 (abortar com ^ G) - Esta é a versão shell

akhileshnair
fonte
1

Com base na resposta de Jay acima, escrevi a seguinte função shell que posso usar:

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
}

Muitas vezes esqueço que o comando é em erlvez de erlang, então isso permite que meu cérebro esquecido use erlangcomo se fosse erl, e erlang -vcomo eu esperaria de algo parecido elixir.

Josh Smith
fonte
-6

Um comando simples que você pode usar:

erl --version
Jeremie Ges
fonte
2
Este comando leva ao shell. A questão é como obter apenas a versão para o script.
Eric Platon