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


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

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 .


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

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

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


2
Najlepsza odpowiedź - chociaż byś sobie życzył - wersja zadziała.
— Charlie,

7

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


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


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"

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


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.


-6

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

erl --version

2
To polecenie prowadzi do powłoki. Pytanie brzmi, jak po prostu pobrać wersję do skryptów.
— Eric Platon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.