Jak uzyskać numer wersji Erlanga z powłoki?

108

Wiele programów zwraca numer wersji za pomocą polecenia:

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

Jest to przydatne do tworzenia skryptów instalacji lub konserwacji programu i innych kontrolowanych magii automatyzacji od administratorów systemu i przyjaciół.

Problem

Jak łatwo uzyskać numer wersji dla Erlang (OTP) ?

W sieci

Oto kilka niezadowalających rozwiązań ([1] i inne samouczki / dokumentacja Erlang):

Emulator

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

Trudne do napisania. Nie znalazłem sposobu na erlwykonanie pojedynczego polecenia z wiersza poleceń powłoki.

Plik wydania

$ 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 (with shell).

Alternatywą może być również sprawdzenie ścieżki instalacji, ale nie jest to przenośne (moja ścieżka instalacji nie obejmuje wersji).

Kontekst osobisty: piszę skrypt, aby zainstalować tę samą wersję RabbitMQ z wtyczkami na kilku komputerach. Niektóre wtyczki mają minimalne wymagania dotyczące wersji OTP i od tego zaczęło się to pytanie.

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

Eric Platon
źródło
Co jest takiego złego w RELEASES? To banalnie przeanalizowane przez Erlanga :-)
Julian Fondren
Ups, nic w tym złego! Zredagowałem post pod kątem kontekstu. Miałem na myśli parsowanie struny Erlanga za pomocą narzędzi powłoki. Moim celem jest skryptowanie zadań SA dla pakietu Erlang.
Eric Platon
Nie rozumiem jeszcze składni Erlang; Chcę tylko sprawdzić, czy zainstalowana wersja obsługuje Riak, czy nie. W roli głównej i mając nadzieję, że pewnego dnia Erlang zapewni prostszy sposób zgłaszania swojej wersji administratorom narzędzi, które są od niego zależne.
Iain Samuel McLean Elder,
erl - wersja.
Michael Dimmitt

Odpowiedzi:

153
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Odobenus Rosmarus
źródło
przepraszam, nie widziałem bardziej wyczerpującej poprzedniej odpowiedzi, kiedy ją
wysyłałem
3
To drukuje (no error logger present) error: "Error in process <0.0.0>w systemie Windows 7 dla mnie. -1
Jonas,
1
@andPat, twoja sugestia zwraca dla mnie wersję powłoki erlang (np. 7.0.2), a nie samego erlang ( 18w moim przypadku).
gdw2
6
Z dokumentacji dla erlang: system_info: Począwszy od OTP 17, numer wydania OTP odpowiada głównemu numerowi wersji OTP. Żaden argument erlang: system_info () nie podaje dokładnej wersji OTP. Zobacz moją odpowiedź poniżej na jeszcze brzydsze polecenie, które drukuje również pomniejszą wersję na moim komputerze deweloperskim.
Jay
2
W systemie Windows 7 musiałem zamienić pojedyncze cudzysłowy na podwójne. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff
81

Pozostałe odpowiedzi wyświetlają tylko wersję główną od OTP 17 (z docs dla erlang: system_info ). Działa to w celu wyświetlenia wersji głównej i pobocznej na moim komputerze deweloperskim:

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

Odczytuje się z odpowiedniego pliku, zgodnie z opisem w dokumentacji .

Sójka
źródło
2
Dzięki, to przydatne! Ponadto, można pozbyć się cytatami i \n, a także uczynić kod krótszy z tylko jedną zmianą: 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
W systemie Windows 7 musiałem zamienić pojedyncze cudzysłowy na podwójne cudzysłowy (i odwrotnie). 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

(Dodaję tę odpowiedź tutaj, ponieważ szukałem jej co najmniej 3 razy w ciągu ostatnich trzech miesięcy)

Począwszy od wersji 17.0, wydania mają nowy format numeru wersji (17.0, 17.1, ...), ale erlang:system_info(otp_release).zwraca tylko główny numer wersji.

W celu uzyskania pełnego numeru wersji należy sprawdzić zawartość OTP_RELEASEpliku we wspomnianym releasesfolderze.

$ 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

EDYTOWAĆ

# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4
juan.facorro
źródło
Nie mogę znaleźć tego pliku według twojego opisu, find / -name "OTP_RELEASE"też go nie widzę, ale mam zainstalowany OTP 17.x. Skąd mam wiedzieć, co to jest „x”?
NobbZ
1
@NobbZ Uzupełniłem odpowiedź o dodatkowe informacje, właśnie sprawdziłem iw aktualnej wersji Erlang / OTP, którą zainstalowałem (17.4), plik faktycznie się nazywa OTP_VERSION.
juan.facorro
1
z jedną liniącat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0
14

init docs , połączone przez „man erl”.

-eval Wyr

Skanuje, analizuje i ocenia dowolne wyrażenie Wyraż podczas inicjalizacji systemu. Jeśli którykolwiek z tych kroków nie powiedzie się (błąd składni, błąd analizy lub wyjątek podczas oceny), Erlang zatrzymuje się i wyświetla komunikat o błędzie. Oto przykład, który wysiewa generator liczb losowych:

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

W tym przykładzie Erlang jest kalkulatorem szesnastkowym:

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

Jeśli określono wiele wyrażeń -eval, są one oceniane sekwencyjnie w określonej kolejności. Wyrażenia -eval są oceniane sekwencyjnie z wywołaniami funkcji -s i -run (również w podanej kolejności). Podobnie jak w przypadku opcji -s i -run, ocena, która nie kończy się, blokuje proces inicjalizacji systemu.

A zatem,

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Julian Fondren
źródło
Dziękuję Julianie za szczegóły. Jak mogłem zapomnieć o wyszukiwaniu evalsłowa kluczowego w instrukcji?
Eric Platon
12

Aby pobrać wersję EShell (Erlang Shell), możesz użyć:

erlang:system_info(version).

i pobrać wersję Erlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


wprowadź opis obrazu tutaj

Miloud Eloumri
źródło
2
Najlepsza odpowiedź - chociaż byś sobie życzył - wersja zadziała.
Charlie,
7

Znaleźć w /usr/lib/erlang/releases/18/OTP_VERSION

Sener DEMIRAL
źródło
To działa, tak. Podobnie jak w przypadku sekcji pliku wydania w pytaniu, problem propozycji polega na tym, że zakłada ona znajomość ścieżki instalacji. Zaletą jest uzyskanie pełnej wersji. Dla mnie 18.2.1.
Eric Platon,
Ten plik nie istnieje w CentOS 7
Eduardo Cuomo
/usr/lib/erlang/releases - zainstalowany przez ansible
Olga
4

erl + V lub możesz użyć erl -version

wynik: emulator Erlang (SMP, ASYNC_THREADS) (BEAM) wersja 5.8.5

Shrikant
źródło
5
Zwraca to erlwersję emulatora, a nie numer wersji programu Erlang (np. „R15B03”). Wszystko to mogłoby być takie proste ;-)
Eric Platon
2

Znajduje erl w twojej PATH i odczytuje plik RELEASES, aby wyodrębnić numer wydania erlang.

awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
taylorcc
źródło
1

Otwórz terminal i wprowadź polecenie erl

Otrzymasz następujące dane wyjściowe:

Erlang R16B03 (erts-5.10.4) [źródło] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-poll: false] Eshell V5.10.4 (przerwij za pomocą ^ G)

Erlang R16B03 (erts-5.10.4) [źródło] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-poll: false] - to jest wersja językowa

Eshell V5.10.4 (przerwij za pomocą ^ G) - to jest wersja powłoki

akhileshnair
źródło
1

Na podstawie powyższej odpowiedzi Jaya napisałem następującą funkcję powłoki, której mogę użyć:

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
}

Często zapominam, że polecenie jest erlraczej niż erlang, więc pozwala mojemu zapominalskiemu mózgowi używać erlangtak, jakby było erl, i erlang -vtak , jak oczekiwałbym od czegoś takiego elixir.

Josh Smith
źródło
-6

Proste polecenie, którego możesz użyć:

erl --version
Jeremie Ges
źródło
2
To polecenie prowadzi do powłoki. Pytanie brzmi, jak po prostu pobrać wersję do skryptów.
Eric Platon