Как получить номер версии Erlang из оболочки?

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

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

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

Проблема

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

В сети

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

Эмулятор

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

Трудно до script. Я не нашел способ иметь 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}].

Разбор рая (с оболочкой).

Альтернативой может быть также проверка пути установки, но это не переносимо (мой путь установки не включает версию для одного).

Личный контекст: я пишу script для установки той же версии RabbitMQ с плагинами на нескольких машинах. Некоторые плагины имеют минимальные требования к версии OTP, и так начинается этот вопрос.

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

(Я добавляю этот ответ здесь, так как я искал это как минимум 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

ИЗМЕНИТЬ

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

Ответ 4

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

Ответ 5

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

erlang:system_info(version).

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

erlang:system_info(otp_release).


enter image description here

Ответ 6

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

Ответ 7

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

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

Ответ 8

Находит erl в вашей PATH и читает файл RELEASES для извлечения номера версии erlang.

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

Ответ 9

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

Вы получите следующий результат:

Erlang R16B03 (erts-5.10.4) [источник] [64-бит] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] Eshell V5.10.4 (прервать с ^ G)

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

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

Ответ 10

Если у вас установлена арматура, сделайте это:

$ rebar3 --version

результат: rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5

Ответ 11

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

erlang () {
    if [[ [email protected] == "-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.

Ответ 12

Простую команду, которую вы можете использовать:

erl --version