Ответ 1
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
Многие программы возвращают номер версии с помощью следующей команды:
$ 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
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
В других ответах отображается только основная версия с 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 раза за последние три месяца)
Начиная с версий версии 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
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
Чтобы получить версию EShell (Erlang Shell), вы можете использовать:
erlang:system_info(version).
и для получения версии Erlang OTP (Open Telecom Platform):
erlang:system_info(otp_release).
Найти в /usr/lib/erlang/releases/18/OTP_VERSION
erl + V или вы можете использовать erl -version
: эмулятор Erlang (SMP, ASYNC_THREADS) (BEAM) версии 5.8.5
Находит erl в вашей PATH и читает файл RELEASES для извлечения номера версии erlang.
awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
Откройте терминал и введите команду 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) - это версия оболочки
Если у вас установлена арматура, сделайте это:
$ rebar3 --version
результат: rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5
Основываясь на ответе 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
.
Простую команду, которую вы можете использовать:
erl --version