scripts script resueltos paso pasar parametros hacer español ejercicios ejemplos como comandos shell erlang

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



scripts linux ejercicios resueltos (10)

(Estoy agregando esta respuesta aquí porque he buscado esto 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 archivo OTP_RELEASE en la carpeta de releases 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

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 crear scripts de la instalación o mantenimiento del programa, y ​​alguna otra magia de automatización controlada de administradores del sistema y amigos.

Problema

¿Cómo obtener fácilmente el número de versión para 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 forma de que erl ejecute un solo comando desde un intérprete de comandos de shell.

Archivo de liberación

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

Parsing paradise (con caparazón).

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, para uno).

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 de OTP, y así es como comenzó esta pregunta.

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


Abra la terminal e ingrese el comando erl

Obtendrá el siguiente resultado:

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

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

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


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


Encuentra el erl en tu PATH 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"


Las otras respuestas solo muestran una versión principal a partir de OTP 17 (de docs for 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 del archivo apropiado, como se describe en los documentos .


Puedes utilizar:

erlang:system_info(version).

y / o

erlang:system_info(otp_release).


Un comando simple que puedes usar:

erl --version


erl + V o puede usar la versión erl

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


init docs , enlazados 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 simula el generador de números aleatorios:

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

Este ejemplo usa Erlang como una calculadora hexadecimal:

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

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

Así,

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


erl -eval ''erlang:display(erlang:system_info(otp_release)), halt().'' -noshell