Wie bekomme ich Erlangs Versionsnummer von einer Shell?


108

Viele Programme geben ihre Versionsnummer mit einem Befehl zurück wie:

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

Dies ist nützlich, um Skripte für die Installation oder Wartung des Programms und einige andere kontrollierte Automatisierungszauber von Systemadministratoren und Freunden zu erstellen.

Problem

Wie erhalte ich einfach die Versionsnummer für Erlang (OTP) ?

Im Netz

Hier sind einige unbefriedigende Lösungen ([1] und andere Tutorials / Erlang-Dokumentation):

Emulator

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

Schwer zu schreiben. Ich habe keine Möglichkeit gefunden erl, einen einzelnen Befehl über eine Shell-Eingabeaufforderung auszuführen.

Datei freigeben

$ 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-Paradies (mit Shell).

Eine Alternative könnte auch darin bestehen, den Installationspfad zu überprüfen, der jedoch nicht portierbar ist (mein Installationspfad enthält zum einen nicht die Version).

Persönlicher Kontext: Ich schreibe ein Skript, um dieselbe Version von RabbitMQ mit Plugins auf mehreren Computern zu installieren. Einige Plugins stellen nur minimale Anforderungen an die OTP-Version, und so begann diese Frage.

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


Was ist so schlimm an RELEASES? Es wird trivial von Erlang analysiert :-)
Julian Fondren

Ups, nichts Schlimmes damit! Ich habe den Beitrag für den Kontext bearbeitet. Ich wollte den Erlang-String mit Shell-Tools analysieren. Mein Ziel ist es, SA-Aufgaben für ein Erlang-Paket zu schreiben.
Eric Platon

Ich verstehe die Erlang-Syntax noch nicht. Ich möchte nur überprüfen, ob die installierte Version Riak unterstützt oder nicht. Wenn Sie dies angeben und hoffen, dass Erlang eines Tages eine einfachere Möglichkeit bietet, seine Version Administratoren von Tools zu melden, die davon abhängen.
Iain Samuel McLean Elder

erl --version.
Michael Dimmitt

Antworten:


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

Entschuldigung, ich habe keine umfassendere vorherige Antwort gesehen, als ich sie
gepostet

3
Dies druckt (no error logger present) error: "Error in process <0.0.0>unter Windows 7 für mich. -1
Jonas

1
@andPat, Ihr Vorschlag gibt die Version der erlang- Shell für mich zurück (z. B. 7.0.2), nicht erlang selbst ( 18in meinem Fall).
GDW2

6
Aus den Dokumenten für erlang: system_info: Ab OTP 17 entspricht die OTP-Versionsnummer der Hauptversionsnummer des OTP. Kein Argument erlang: system_info () gibt die genaue OTP-Version an. In meiner Antwort unten finden Sie einen noch hässlicheren Befehl, mit dem auch kleinere Versionen auf meinem Entwicklungscomputer gedruckt werden.
Jay

2
Unter Windows 7 musste ich die einfachen Anführungszeichen durch doppelte Anführungszeichen ersetzen. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
Yohosuff

81

Die anderen Antworten zeigen nur die Hauptversion ab OTP 17 (aus den Dokumenten für erlang: system_info ). Dies funktioniert, um die Haupt- und Nebenversion auf meinem Entwicklungscomputer anzuzeigen:

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

Dies liest aus der entsprechenden Datei, wie in den Dokumenten beschrieben .


2
Danke, das ist nützlich! Außerdem können Sie die Anführungszeichen entfernen und \nden Code mit nur einer Änderung verkürzen : 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

Unter Windows 7 musste ich einfache Anführungszeichen gegen doppelte Anführungszeichen austauschen (und umgekehrt). 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

(Ich füge diese Antwort hier hinzu, da ich in den letzten drei Monaten mindestens dreimal danach gesucht habe.)

Ab Version 17.0 haben Versionen ein neues Format in ihrer Versionsnummer (17.0, 17.1, ...), geben jedoch erlang:system_info(otp_release).nur die Hauptversionsnummer zurück.

Um die vollständige Versionsnummer zu erhalten, muss der Inhalt der OTP_RELEASEDatei unter dem bereits erwähnten releasesOrdner überprüft werden .

$ 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

BEARBEITEN

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

Ich finde diese Datei nicht in Ihrer Beschreibung, find / -name "OTP_RELEASE"sehe sie auch nicht, aber ich habe OTP 17.x installiert. Wie kann ich wissen, was "x" ist?
NobbZ

1
@NobbZ Ich habe die Antwort mit zusätzlichen Informationen aktualisiert, ich habe sie gerade überprüft und in der aktuellen Erlang / OTP-Version, die ich installiert habe (17.4), wird die Datei tatsächlich aufgerufen OTP_VERSION.
juan.facorro

1
mit einer Zeilecat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0

14

init docs , verknüpft mit 'man erl'.

-eval Ausdruck

Scannt, analysiert und wertet einen beliebigen Ausdruck Expr während der Systeminitialisierung aus. Wenn einer dieser Schritte fehlschlägt (Syntaxfehler, Analysefehler oder Ausnahme während der Auswertung), stoppt Erlang mit einer Fehlermeldung. Hier ist ein Beispiel, das den Zufallszahlengenerator setzt:

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

In diesem Beispiel wird Erlang als Hexadezimalrechner verwendet:

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

Wenn mehrere Ausdrücke angegeben werden, werden sie nacheinander in der angegebenen Reihenfolge ausgewertet. -eval-Ausdrücke werden nacheinander mit den Funktionsaufrufen -s und -run ausgewertet (dies auch in der angegebenen Reihenfolge). Wie bei -s und -run blockiert eine Auswertung, die nicht beendet wird, den Systeminitialisierungsprozess.

So,

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

Vielen Dank, Julian, für das Detail. Wie könnte ich vergessen, das evalSchlüsselwort im Handbuch zu suchen ?
Eric Platon

12

Um die EShell-Version (Erlang Shell) abzurufen, können Sie Folgendes verwenden:

erlang:system_info(version).

und um die Erlang OTP- Version ( Open Telecom Platform ) abzurufen :

erlang:system_info(otp_release).


Geben Sie hier die Bildbeschreibung ein


2
Die beste Antwort. Obwohl Sie wünschen würden - Version würde funktionieren.
Charlie

7

Zu finden in /usr/lib/erlang/releases/18/OTP_VERSION


Das funktioniert ja. Wie im Abschnitt zur Freigabedatei in der Frage besteht das Problem Ihres Vorschlags darin, dass die Kenntnis des Installationspfads vorausgesetzt wird. Der Vorteil hierbei ist, dass Sie die Vollversion erhalten. Für mich : 18.2.1.
Eric Platon

Diese Datei existiert nicht unter CentOS 7
Eduardo Cuomo

/usr/lib/erlang/releases - installiert über ansible
Olga

4

erl + V oder Sie können erl -version verwenden

Ergebnis: Emulator Erlang (SMP, ASYNC_THREADS) (BEAM) Version 5.8.5


5
Dies gibt die erlEmulatorversion zurück, nicht die Versionsnummer der Erlang-Version (z. B. "R15B03"). Das alles könnte so einfach sein ;-)
Eric Platon

2

Findet das Erl in Ihrem PATH und liest die RELEASES-Datei, um die erlang-Versionsnummer zu extrahieren.

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

1

Terminal öffnen und Befehl erl eingeben

Sie erhalten folgende Ausgabe:

Erlang R16B03 (erts-5.10.4) [Quelle] [64-Bit] [smp: 4: 4] [Async-Threads: 10] [Kernel-Umfrage: false] Eshell V5.10.4 (Abbruch mit ^ G)

Erlang R16B03 (erts-5.10.4) [Quelle] [64-Bit] [SMP: 4: 4] [Async-Threads: 10] [Kernel-Umfrage: Falsch] - Dies ist die Sprachversion

Eshell V5.10.4 (Abbruch mit ^ G) - Dies ist die Shell-Version


1

Basierend auf Jays Antwort oben habe ich die folgende Shell-Funktion geschrieben, die ich verwenden kann:

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
}

Ich vergesse oft, dass der Befehl erleher als ist erlang, also kann mein vergessliches Gehirn so verwenden, erlangals ob es so wäre erlund erlang -vwie ich es von so etwas erwarten würde elixir.


-6

Ein einfacher Befehl, den Sie verwenden können:

erl --version

2
Dieser Befehl führt zur Shell. Die Frage ist, wie man nur die Version für die Skripterstellung erhält.
Eric Platon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.