¿Cómo obtener el número de versión de lanzamiento de Erlang desde un shell?

108

Muchos programas devuelven su número de versión con un comando como:

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

Esto es útil para programar la instalación o el mantenimiento del programa, y ​​alguna otra magia de automatización controlada de los administradores del sistema y amigos.

Problema

¿Cómo obtener fácilmente el número de versión de Erlang (OTP) ?

En la red

Aquí hay algunas soluciones insatisfactorias ([1] y otros tutoriales / documentación de Erlang):

Emulador

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

Difícil de escribir. No he encontrado una manera de erlejecutar un solo comando desde un indicador de shell.

Archivo de lanzamiento

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

Analizando el paraíso (con concha).

Una alternativa también podría ser verificar la ruta de instalación, pero eso no es portátil (mi ruta de instalación no incluye la versión, por ejemplo).

Contexto personal: estoy escribiendo un script para instalar la misma versión de RabbitMQ con complementos en varias máquinas. Algunos complementos tienen requisitos mínimos en la versión OTP, y así es como comenzó esta pregunta.

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

Eric Platon
fuente
¿Qué tienen de malo los LANZAMIENTOS? Erlang lo analiza trivialmente :-)
Julian Fondren
Vaya, ¡nada malo con eso! Edité la publicación para el contexto. Me refería a analizar la cadena Erlang con herramientas de shell. Mi objetivo es crear secuencias de comandos de tareas de SA para un paquete Erlang.
Eric Platon
Todavía no entiendo la sintaxis de Erlang; Solo quiero comprobar si la versión instalada es compatible con Riak o no. Protagonizando esto y esperando que algún día Erlang brinde una forma más sencilla de reportar su versión a los administradores de las herramientas que dependen de ella.
Iain Samuel McLean Elder
erl --versión.
Michael Dimmitt

Respuestas:

153
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Odobenus Rosmarus
fuente
lo siento, no vi una respuesta anterior más completa cuando la
publiqué
3
Esto se imprime (no error logger present) error: "Error in process <0.0.0>en Windows 7 para mí. -1
Jonas
1
@andPat, su sugerencia devuelve la versión del shell de erlang para mí (por ejemplo 7.0.2), no el propio erlang ( 18, en mi caso).
gdw2
6
De los documentos de erlang: system_info: A partir de OTP 17, el número de versión de OTP corresponde al número de versión principal de OTP. Ningún argumento erlang: system_info () da la versión exacta de OTP. Vea mi respuesta a continuación para obtener un comando aún más feo que también imprime una versión menor en mi máquina de desarrollo.
Jay
2
En Windows 7, tuve que reemplazar las comillas simples por comillas dobles. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff
81

Las otras respuestas solo muestran la versión principal a partir de OTP 17 (de documentos para erlang: system_info ). Esto funciona para mostrar la versión mayor y menor en mi máquina de desarrollo:

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

Esto se lee en el archivo apropiado, como se describe en los documentos .

Arrendajo
fuente
2
¡Gracias, esto es útil! También, usted puede deshacerse de las cotizaciones y \ntambién hacer el código más corto con sólo un cambio: 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
En Windows 7, tuve que intercambiar comillas simples con comillas dobles (y viceversa). 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

(Estoy agregando esta respuesta aquí ya que lo he buscado al menos 3 veces en los últimos tres meses)

A partir de la versión 17.0, las versiones tienen un nuevo formato en su número de versión (17.0, 17.1, ...) pero erlang:system_info(otp_release).solo devuelve el número de versión principal.

Para obtener el número de versión completo, es necesario verificar el contenido del OTP_RELEASEarchivo en la releasescarpeta ya 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
fuente
No encuentro ese archivo por su descripción, find / -name "OTP_RELEASE"tampoco lo veo, pero tengo OTP 17.x instalado. ¿Cómo puedo saber qué es "x"?
NobbZ
1
@NobbZ Actualicé la respuesta con información adicional, acabo de verificar y en la versión actual de Erlang / OTP que instalé (17.4), el archivo se llama realmente OTP_VERSION.
juan.facorro
1
con una líneacat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0
14

init docs , vinculado por 'man erl'.

-eval Expr

Escanea, analiza y evalúa una expresión arbitraria Expr durante la inicialización del sistema. Si alguno de estos pasos falla (error de sintaxis, error de análisis o excepción durante la evaluación), Erlang se detiene con un mensaje de error. Aquí hay un ejemplo que inicia el generador de números aleatorios:

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

Este ejemplo usa Erlang como calculadora hexadecimal:

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

Si se especifican varias expresiones -eval, se evalúan secuencialmente en el orden especificado. Las expresiones -eval se evalúan secuencialmente con -s y -run llamadas de función (esto también en el orden especificado). Al igual que con -s y -run, una evaluación que no termina bloquea el proceso de inicialización del sistema.

Así,

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Julian Fondren
fuente
Gracias, Julian, por el detalle. ¿Cómo podría olvidarme de buscar la evalpalabra clave en el manual?
Eric Platon
12

Para recuperar la versión de EShell (Erlang Shell), puede usar:

erlang:system_info(version).

y para recuperar la versión de Erlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


ingrese la descripción de la imagen aquí

Miloud Eloumri
fuente
2
La mejor respuesta Aunque desearía, la versión funcionaría.
Charlie
7

Encontrar en /usr/lib/erlang/releases/18/OTP_VERSION

Sener DEMIRAL
fuente
Eso funciona, sí. Al igual que la sección del archivo de lanzamiento en la pregunta, el problema de su propuesta es que asume el conocimiento de la ruta de instalación. El beneficio aquí es obtener la versión completa. Para mí: 18.2.1.
Eric Platon
Este archivo no existe en CentOS 7
Eduardo Cuomo
/usr/lib/erlang/releases - instalado a través de ansible
Olga
4

erl + V o puede usar erl -version

resultado: Emulador Erlang (SMP, ASYNC_THREADS) (BEAM) versión 5.8.5

Shrikant
fuente
5
Esto devuelve la erlversión del emulador, no el número de versión de lanzamiento de Erlang (por ejemplo, "R15B03"). Todo eso podría ser tan fácil ;-)
Eric Platon
2

Encuentra el erl en su RUTA y lee el archivo RELEASES para extraer el número de versión de erlang.

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

Abra la terminal e ingrese el comando erl

Obtendrá el siguiente resultado:

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

Erlang R16B03 (erts-5.10.4) [fuente] [64-bit] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] - Esta es la versión del idioma

Eshell V5.10.4 (abortar con ^ G) : esta es la versión de shell

akhileshnair
fuente
1

Basado en la respuesta de Jay anterior, escribí la siguiente función de shell que puedo 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
}

A menudo olvido que el comando es en erllugar de erlang, por lo que esto permite que mi cerebro olvidadizo lo use erlangcomo si lo fuera erl, y erlang -vcomo esperaría de algo así elixir.

Josh Smith
fuente
-6

Un comando simple que puedes usar:

erl --version
Jeremie Ges
fuente
2
Este comando conduce al shell. La pregunta es cómo obtener la versión para la creación de scripts.
Eric Platon