Как получить номер версии релиза Эрланга из оболочки? - PullRequest
97 голосов
/ 05 марта 2012

Многие программы возвращают свой номер версии с помощью команды вроде:

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

Это полезно для написания сценариев установки или обслуживания программы, а также некоторых других управляемых средств автоматизации от системных администраторов и друзей.

Задача

Как легко получить номер версии для Erlang (OTP) ?

В сети

Вот некоторые неудовлетворительные решения ([1] и другие руководства / документация Erlang):

Emulator

$ 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

Ответы [ 12 ]

140 голосов
/ 05 марта 2012
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
59 голосов
/ 17 декабря 2015

Другие ответы отображают только основную версию OTP 17 (из документы для 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

Это читает из соответствующего файла, как описано в документах .

31 голосов
/ 11 декабря 2014

(я добавляю этот ответ сюда, поскольку я искал его как минимум 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
14 голосов
/ 05 марта 2012

init docs , связанный с 'man erl'.

-eval Expr

Сканирует, анализирует и оценивает произвольное выражение 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
10 голосов
/ 05 февраля 2017

Чтобы получить версию EShell (Erlang Shell), вы можете использовать:

erlang:system_info(version).

и для получения Erlang OTP ( Open Telecom Platform ) версия:

erlang:system_info(otp_release).


enter image description here

5 голосов
/ 05 января 2016

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

4 голосов
/ 14 июня 2013

эрл + в или вы можете использовать erl -version

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

2 голосов
/ 31 декабря 2013

Находит erl в вашем PATH и читает файл RELEASES, чтобы извлечь номер выпуска erlang.

awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
1 голос
/ 09 мая 2019

Основываясь на ответе Джея выше, я написал следующую функцию оболочки, которую я могу использовать:

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.

1 голос
/ 20 апреля 2016

Откройте терминал и введите команду erl

Вы получите следующий вывод:

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp: 4: 4] [асинхронные потоки: 10] [опрос ядра: ложь] Eshell V5.10.4 (отмена с ^ G)

Erlang R16B03 (erts-5.10.4) [источник][64-bit] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] - это языковая версия

Eshell V5.10.4 (прерватьс ^ G) - это версия оболочки

...