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 erl
executar 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.
Respostas:
fonte
(no error logger present) error: "Error in process <0.0.0>
no Windows 7 para mim. -17.0.2
), não o próprio erlang (18
no meu caso).erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
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:
Ele é lido do arquivo apropriado, conforme descrito nos documentos .
fonte
\n
e 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
.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
(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_RELEASE
arquivo nareleases
pasta já mencionada .EDITAR
fonte
find / -name "OTP_RELEASE"
também não o vejo, mas tenho o OTP 17.x instalado. Como posso saber o que é "x"?OTP_VERSION
.cat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
documentos do init , vinculados por 'man erl'.
Portanto,
fonte
eval
palavra - chave no manual?Para recuperar a versão EShell (Erlang Shell), você pode usar:
e para recuperar a versão Erlang OTP ( Open Telecom Platform ):
fonte
Encontre em
/usr/lib/erlang/releases/18/OTP_VERSION
fonte
18.2.1
./usr/lib/erlang/releases
- instalado via ansibleerl + V ou você pode usar erl -version
resultado: emulador Erlang (SMP, ASYNC_THREADS) (BEAM) versão 5.8.5
fonte
erl
versão do emulador, não o número da versão do Erlang (por exemplo, "R15B03"). Tudo isso poderia ser tão fácil ;-)Encontra o erl em seu PATH e lê o arquivo RELEASES para extrair o número da versão erlang.
fonte
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
fonte
Com base na resposta de Jay acima, escrevi a seguinte função shell que posso usar:
Muitas vezes esqueço que o comando é em
erl
vez deerlang
, então isso permite que meu cérebro esquecido useerlang
como se fosseerl
, eerlang -v
como eu esperaria de algo parecidoelixir
.fonte
Um comando simples que você pode usar:
fonte