Многие программы возвращают номер своей версии с помощью такой команды:
$ 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, и именно с этого начался этот вопрос.
Ответы:
источник
(no error logger present) error: "Error in process <0.0.0>
для меня в Windows 7. -17.0.2
), а не сам erlang (18
в моем случае).erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
В других ответах отображается только основная версия OTP 17 (из документации для erlang: system_info ). Это работает для отображения основной и дополнительной версии на моей машине разработки:
Это читается из соответствующего файла, как описано в документации .
источник
\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
.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 раза)
Начиная с версии 17.0 выпуски имеют новый формат номера версии (17.0, 17.1, ...), но
erlang:system_info(otp_release).
возвращают только основной номер версии.Чтобы получить полный номер версии, необходимо проверить содержимое
OTP_RELEASE
файла в уже упомянутойreleases
папке.РЕДАКТИРОВАТЬ
источник
find / -name "OTP_RELEASE"
тоже не видит, но у меня OTP 17.x установлен. Как я могу узнать, что такое «x»?OTP_VERSION
.cat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
init docs , связанные с помощью man erl.
Таким образом,
источник
eval
ключевому слову в руководстве?Чтобы получить версию EShell (Erlang Shell), вы можете использовать:
и получить версию Erlang OTP ( Open Telecom Platform ):
источник
Найти в
/usr/lib/erlang/releases/18/OTP_VERSION
источник
18.2.1
./usr/lib/erlang/releases
- установлено через ансибльerl + V или вы можете использовать erl -version
Результат: Эмулятор Erlang (SMP, ASYNC_THREADS) (BEAM) версии 5.8.5
источник
erl
версию эмулятора, а не номер версии выпуска Erlang (например, «R15B03»). Все это может быть так просто ;-)Находит erl в вашем PATH и читает файл RELEASES, чтобы извлечь номер версии erlang.
источник
Откройте терминал и введите команду 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) - это версия оболочки
источник
Основываясь на ответе Джея выше, я написал следующую функцию оболочки, которую могу использовать:
Я часто забываю , что команда ,
erl
а неerlang
, так что это позволяет мой забывчивый мозг просто использовать ,erlang
как если бы это былоerl
, иerlang -v
как я ожидал бы от чего - то вродеelixir
.источник
Вы можете использовать простую команду:
источник