Come ottenere il numero di versione di rilascio di Erlang da una shell?


108

Molti programmi restituiscono il numero di versione con un comando come:

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

Ciò è utile per creare script per l'installazione o la manutenzione del programma e per qualche altra magia di automazione controllata da amministratori di sistema e amici.

Problema

Come ottenere facilmente il numero di versione di Erlang (OTP) ?

In rete

Ecco alcune soluzioni insoddisfacenti ([1] e altri tutorial / documentazione Erlang):

Emulatore

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

Difficile da scrivere. Non ho trovato un modo per erleseguire un singolo comando da un prompt della shell.

File di rilascio

$ 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 conchiglia).

Un'alternativa potrebbe anche essere il controllo del percorso di installazione, ma non è portatile (il mio percorso di installazione non include la versione, per esempio).

Contesto personale: sto scrivendo uno script per installare la stessa versione di RabbitMQ con plugin su più macchine. Alcuni plugin hanno requisiti minimi per la versione OTP ed è così che è iniziata questa domanda.

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


Cosa c'è di così brutto in RELEASES? È banalmente analizzato da Erlang :-)
Julian Fondren

Ops, niente di male con quello! Ho modificato il post per il contesto. Intendevo analizzare la stringa Erlang con gli strumenti della shell. Il mio obiettivo è scrivere attività SA per un pacchetto Erlang.
Eric Platon

Non capisco ancora la sintassi di Erlang; Voglio solo controllare se la versione installata supporta Riak o meno. Protagonista questo e sperando che un giorno Erlang fornirà un modo più semplice per segnalare la sua versione agli amministratori degli strumenti che dipendono da essa.
Iain Samuel McLean Elder

erl: versione.
Michael Dimmitt

Risposte:


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

scusa non ho visto una risposta precedente più completa quando l'ho
postata

3
Questo stampa (no error logger present) error: "Error in process <0.0.0>su Windows 7 per me. -1
Jonas

1
@andPat, il tuo suggerimento restituisce la versione della shell erlang per me (ad esempio 7.0.2), non erlang stesso ( 18, nel mio caso).
gdw2

6
Dai documenti per erlang: system_info: A partire da OTP 17, il numero di versione OTP corrisponde al numero di versione OTP principale. Nessun argomento erlang: system_info () fornisce l'esatta versione OTP. Vedi la mia risposta di seguito per un comando ancora più brutto che stampa anche una versione minore sulla mia macchina di sviluppo.
Jay

2
Su Windows 7, ho dovuto sostituire le virgolette singole con virgolette doppie. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff

81

Le altre risposte visualizzano solo la versione principale a partire da OTP 17 (dalla documentazione per erlang: system_info ). Funziona per visualizzare la versione principale e secondaria sulla mia macchina di sviluppo:

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

Si legge dal file appropriato, come descritto nei documenti .


2
Grazie, è utile! Inoltre, è possibile eliminare le virgolette e \nanche rendere il codice più corta con un solo 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

Su Windows 7, ho dovuto scambiare virgolette singole con virgolette doppie (e 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

(Aggiungo questa risposta qui poiché l'ho cercata almeno 3 volte negli ultimi tre mesi)

A partire dalla versione 17.0 i rilasci hanno un nuovo formato nel numero di versione (17.0, 17.1, ...) ma erlang:system_info(otp_release).restituisce solo il numero di versione principale.

Per ottenere il numero di versione completo è necessario controllare il contenuto del OTP_RELEASEfile nella releasescartella già citata .

$ 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

MODIFICARE

# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4

Non trovo quel file dalla tua descrizione, find / -name "OTP_RELEASE"non lo vedo neanche, ma ho OTP 17.x installato. Come posso sapere cosa è "x"?
NobbZ

1
@NobbZ Ho aggiornato la risposta con ulteriori informazioni, ho appena controllato e nella versione corrente di Erlang / OTP che ho installato (17.4) il file è effettivamente chiamato OTP_VERSION.
juan.facorro

1
con una rigacat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0

14

init docs , collegati da "man erl".

-eval Expr

Esegue la scansione, analizza e valuta un'espressione arbitraria Expr durante l'inizializzazione del sistema. Se uno qualsiasi di questi passaggi fallisce (errore di sintassi, errore di analisi o eccezione durante la valutazione), Erlang si interrompe con un messaggio di errore. Ecco un esempio che semina il generatore di numeri casuali:

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

Questo esempio utilizza Erlang come calcolatrice esadecimale:

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

Se vengono specificate più espressioni di livello, vengono valutate in sequenza nell'ordine specificato. Le espressioni -eval vengono valutate sequenzialmente con le chiamate di funzione -s e -run (anche nell'ordine specificato). Come con -s e -run, una valutazione che non termina, blocca il processo di inizializzazione del sistema.

Così,

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

Grazie, Julian, per i dettagli. Come potrei dimenticare di cercare la evalparola chiave nel manuale?
Eric Platon

12

Per recuperare la versione di EShell (Erlang Shell), puoi usare:

erlang:system_info(version).

e per recuperare la versione Erlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


inserisci qui la descrizione dell'immagine


2
La risposta migliore Anche se vorresti, la versione funzionerebbe.
Charlie

7

Trovare in /usr/lib/erlang/releases/18/OTP_VERSION


Funziona, sì. Come la sezione del file di rilascio nella domanda, il problema della tua proposta è che presuppone la conoscenza del percorso di installazione. Il vantaggio qui è ottenere la versione completa. Per me: 18.2.1.
Eric Platon

Questo file non esiste su CentOS 7
Eduardo Cuomo

/usr/lib/erlang/releases - installato tramite ansible
Olga

4

erl + V oppure puoi usare erl -version

risultato: Emulatore Erlang (SMP, ASYNC_THREADS) (BEAM) versione 5.8.5


5
Questo restituisce la erlversione dell'emulatore, non il numero di versione del rilascio Erlang (ad esempio "R15B03"). Tutto ciò potrebbe essere così facile ;-)
Eric Platon

2

Trova l'erl nel tuo PERCORSO e legge il file RELEASES per estrarre il numero di rilascio di erlang.

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

1

Apri il terminale e inserisci il comando erl

Otterrai il seguente output:

Erlang R16B03 (erts-5.10.4) [sorgente] [64-bit] [smp: 4: 4] [thread asincroni: 10] [kernel-poll: false] Eshell V5.10.4 (interrompi con ^ G)

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] - Questa è la versione in lingua

Eshell V5.10.4 (interrompi con ^ G) - Questa è la versione della shell


1

Sulla base della risposta di Jay sopra, ho scritto la seguente funzione di shell che posso usare:

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
}

Spesso dimentico che il comando è erlpiuttosto che erlang, quindi questo consente al mio cervello smemorato di usarlo erlangcome se lo fosse erl, e erlang -vcome mi aspetterei da qualcosa di simile elixir.


-6

Un semplice comando che puoi usare:

erl --version

2
Questo comando porta alla shell. La domanda è come ottenere solo la versione, per lo scripting.
Eric Platon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.