Як отримати номер версії випуску Erlang з оболонки?


108

Багато програм повертають номер своєї версії за допомогою команди типу:

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

Це корисно для створення сценаріїв встановлення або обслуговування програми та деяких інших керованих магій автоматизації від System Admins & friends.

Проблема

Як легко отримати номер версії для Erlang (OTP) ?

У мережі

Ось кілька незадовільних рішень ([1] та інших навчальних посібників / документація Erlang):

Емулятор

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

Важкий сценарій. Я не знайшов способу erlвиконати одну команду з підказки оболонки.

Випустити файл

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

Розбійний рай (з оболонкою).

Альтернативою може бути також перевірка шляху встановлення, але це не є портативним (мій шлях встановлення не включає версію для однієї).

Особистий контекст: я пишу сценарій, щоб встановити одну і ту ж версію RabbitMQ із плагінами на декількох машинах. Деякі плагіни мають мінімальні вимоги до версії OTP, і саме з цього питання почалося.

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


Що так поганого у звільненнях? Це тривіально розбирає Ерланг :-)
Джуліан Фондрен

Ой, нічого поганого в цьому немає! Я відредагував пост для контексту. Я мав на увазі розбір рядка Erlang інструментами оболонки. Моя мета - розписати завдання SA для пакету Erlang.
Ерік Платон

Я ще не розумію синтаксис Ерланга; Я просто хочу перевірити, підтримує чи встановлена ​​версія Riak чи ні. Приєднавшись до цього і сподіваючись, що одного дня Erlang запропонує більш простий спосіб повідомити про свою версію адміністраторам інструментів, які залежать від неї.
Ієн Самуель Маклін Старший

erl - відвернення.
Майкл Діммітт

Відповіді:


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

Вибачте, що не побачив більш вичерпної попередньої відповіді, коли я публікував її
Odobenus Rosmarus

3
Це надрукує (no error logger present) error: "Error in process <0.0.0>для мене Windows 7. -1
Йонас

1
@andPat, ваша пропозиція повертає для мене версію оболонки erlang (наприклад 7.0.2), а не саму erlang ( 18у моєму випадку).
gdw2

6
З Документів для erlang: system_info: Щодо OTP 17, номер випуску OTP відповідає основному номеру версії OTP. Немає аргументу: аргумент system_info () дає точну версію OTP. Дивіться мою відповідь нижче щодо ще більш химерної команди, яка також друкує незначну версію на моїй розробці.
Джей

2
У Windows 7 мені довелося замінити одинарні лапки на подвійні лапки. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
йохосуф

81

В інших відповідях відображається лише основна версія версії OTP 17 (від docs for erlang: system_info ). Це працює для відображення основної та другорядної версії на моїй розробці:

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

Це читається з відповідного файлу, як описано в документах .


2
Дякую, це корисно! Крім того , ви можете позбутися від лапок і , \nа також зробити код коротше , тільки з однією зміною: 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.
Догберт

У Windows 7 мені довелося міняти одинарні лапки подвійними лапками (і навпаки). 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
йохосуф

38

(Я додаю цю відповідь тут, оскільки я шукав це принаймні 3 рази за останні три місяці)

Починаючи з версій 17.0 випуски мають новий формат у своєму номері версії (17.0, 17.1, ...), але erlang:system_info(otp_release).повертає лише основний номер версії.

Для отримання повного номера версії необхідно перевірити вміст OTP_RELEASEфайлу у вже згаданій releasesпапці.

$ 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

EDIT

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

Я не знаходжу цей файл за вашим описом, find / -name "OTP_RELEASE"не бачить його, але у мене встановлений OTP 17.x. Як я можу знати, що таке "х"?
NobbZ

1
@NobbZ Я оновив відповідь додатковою інформацією, я просто перевірив, і у поточній версії Erlang / OTP я встановив (17.4) файл насправді викликається OTP_VERSION.
juan.facorro

1
з одним рядкомcat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0

14

init docs , пов’язані з 'man erl'.

-екв

Сканує, аналізує та оцінює довільний вираз Expr під час ініціалізації системи. Якщо будь-який з цих кроків не вдався (синтаксична помилка, помилка розбору або виняток під час оцінки), Erlang зупиняється повідомленням про помилку. Ось приклад, який засіває генератор випадкових чисел:

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

Цей приклад використовує Erlang як шістнадцятковий калькулятор:

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

Якщо вказано декілька виразів вирівнювання, вони оцінюються послідовно у визначеному порядку. -eval вирази оцінюються послідовно за допомогою викликів -s та -run (це також у вказаному порядку). Як і з -s та -run, оцінка, яка не закінчується, блокує процес ініціалізації системи.

Таким чином,

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

Дякую, Джуліан, за деталі. Як я можу забути шукати evalключове слово в посібнику?
Ерік Платон

12

Щоб отримати версію EShell (Erlang Shell), ви можете використовувати:

erlang:system_info(version).

і отримати версію Erlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


введіть тут опис зображення


2
Найкраща відповідь. Хоча ви хочете - перетворення спрацює.
Чарлі

7

Знайти в /usr/lib/erlang/releases/18/OTP_VERSION


Це працює, так. Як і розділ файлу релізу у питанні, проблема вашої пропозиції полягає в тому, що вона передбачає знання шляху встановлення. Перевага тут полягає в тому, щоб отримати повну версію. Для мене: 18.2.1.
Ерік Платон

Цей файл не існує у CentOS 7
Eduardo Cuomo

/usr/lib/erlang/releases - встановлено через ansible
Ольга

4

erl + V або ви можете використовувати erl -версію

результат: емулятор Erlang (SMP, ASYNC_THREADS) (BEAM) версія 5.8.5


5
Це повертає erlверсію емулятора, а не номер версії випуску Erlang (наприклад, "R15B03"). Все, що може бути таким простим ;-)
Ерік Платон

2

Знаходить erl у вашому PATH та читає файл RELEASES для вилучення номера випуску erlang.

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

1

Відкрийте термінал і введіть команду erl

Ви отримаєте такий вихід:

Erlang R16B03 (erts-5.10.4) [джерело] [64-бітний] [smp: 4: 4] [асинхронні потоки: 10] [ядро-опитування: помилково] Eshell V5.10.4 (скасувати з ^ G)

Erlang R16B03 (erts-5.10.4) [джерело] [64-розрядний] [smp: 4: 4] [async-thread: 10] [ядро-опитування: помилково] - Це мовна версія

Eshell V5.10.4 (перервати з ^ G) - це версія оболонки


1

Виходячи з відповіді Джея вище, я написав таку функцію оболонки, яку можу використовувати:

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
}

Я часто забуваю, що команда erlшвидше, ніж це erlang, тому це дозволяє моєму забудькуватому мозку просто використовувати так, erlangяк ніби це було erl, і erlang -vяк би я очікував від чогось подібного elixir.


-6

Проста команда, яку ви можете використовувати:

erl --version

2
Ця команда веде до оболонки. Питання в тому, як просто отримати версію для сценаріїв.
Ерік Платон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.