许多程序使用如下命令返回其版本号:
$ program --version
program (platform info) v1.2.3
这对于编写程序的安装或维护脚本以及System Admins&amp ;;的其他一些受控自动化魔法非常有用。朋友。
如何轻松获取Erlang(OTP)的版本号?
以下是一些令人不满意的解决方案([1]和其他教程/ Erlang文档):
仿真器
$ erl
1> erlang:system_info(otp_release).
"R13B03"
难以编写脚本。我还没有办法让erl
从shell提示符执行单个命令。
发布文件
$ 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版本的要求很低,这就是问题的起源。
答案 0 :(得分:133)
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
答案 1 :(得分:55)
其他答案仅显示OTP 17的主要版本(来自docs for 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
这将从相应的文件中读取,如the docs中所述。
答案 2 :(得分:31)
(我在这里添加了这个答案,因为我在过去的三个月内至少搜索过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
答案 3 :(得分:13)
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
答案 4 :(得分:10)
要检索EShell(Erlang Shell)版本,您可以使用:
erlang:system_info(version).
并检索Erlang OTP(Open Telecom Platform)版本:
erlang:system_info(otp_release).
答案 5 :(得分:5)
在/usr/lib/erlang/releases/18/OTP_VERSION
答案 6 :(得分:4)
erl + V. 或者你可以使用 erl -version
结果:Erlang(SMP,ASYNC_THREADS)(BEAM)模拟器版本5.8.5
答案 7 :(得分:2)
在PATH中查找erl并读取RELEASES文件以提取erlang版本号。
awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
答案 8 :(得分:1)
打开终端并输入命令erl
您将获得以下输出:
Erlang R16B03(erts-5.10.4)[source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false] Eshell V5.10.4(用^ G中止)
Erlang R16B03(erts-5.10.4)[source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false] - 这是语言版本
Eshell V5.10.4(用^ G中止) - 这是shell版本
答案 9 :(得分:1)
基于上述Jay的回答,我编写了以下可以使用的shell函数:
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
和{{1 }},就像我对erlang -v
这样的期望一样。
答案 10 :(得分:0)
如果您已安装钢筋,请执行以下操作:
$ rebar3 --version
结果:rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5
答案 11 :(得分:0)
我为系统运行了更新并工作
sudo apt-get update
sudo apt-get upgrade
答案 12 :(得分:-3)
您可以使用的简单命令:
erl --version