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

108

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

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

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

Проблема

Как легко получить номер версии для 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 тривиально разбирается :-)
Джулиан Фондрен 05
Ой, ничего плохого в этом нет! Отредактировал пост под контекст. Я имел в виду синтаксический анализ строки Erlang с помощью инструментов оболочки. Моя цель - написать сценарий задач SA для пакета Erlang.
Эрик Платон
Я пока не понимаю синтаксис Erlang; Я просто хочу проверить, поддерживает ли установленная версия Riak или нет. Помечая это и надеясь, что однажды Erlang предоставит более простой способ сообщить о своей версии администраторам инструментов, которые от него зависят.
Iain Samuel McLean Elder
erl --version.
Майкл Диммитт

Ответы:

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
Jonas
1
@andPat, ваше предложение возвращает версию оболочки erlang для меня (например 7.0.2), а не сам erlang ( 18в моем случае).
gdw2
6
Из документации для erlang: system_info: Начиная с OTP 17, номер версии OTP соответствует основному номеру версии OTP. Аргумент erlang: system_info () не дает точной версии OTP. Смотрите в моем ответе ниже еще более уродливую команду, которая также печатает второстепенную версию на моей машине разработки.
Джей
2
В Windows 7 мне пришлось заменить одинарные кавычки на двойные. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff
81

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

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

Джей
источник
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.
Dogbert
В 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
yohosuff
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

РЕДАКТИРОВАТЬ

# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4
juan.facorro
источник
По вашему описанию этого файла не нахожу, find / -name "OTP_RELEASE"тоже не видит, но у меня OTP 17.x установлен. Как я могу узнать, что такое «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.

-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, они вычисляются последовательно в указанном порядке. Выражения -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
Эдуардо Куомо
/usr/lib/erlang/releases - установлено через ансибль
Ольга
4

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

Результат: Эмулятор 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"
Taylorcc
источник
1

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

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

Erlang R16B03 (erts-5.10.4) [исходный код] [64-разрядный] [smp: 4: 4] [асинхронные потоки: 10] [kernel-poll: false] Eshell V5.10.4 (прервать с помощью ^ G)

Erlang R16B03 (erts-5.10.4) [исходный код] [64-разрядный] [smp: 4: 4] [асинхронные потоки: 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
Эта команда ведет к оболочке. Вопрос в том, как просто получить версию для скрипта.
Эрик Платон