如何从shell获取Erlang的发行版本号?

许多程序使用如下命令返回其版本号:

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

这对于编写程序的安装或维护脚本以及系统pipe理员和朋友的一些其他受控自动化魔术非常有用。

问题

如何轻松获得Erlang(OTP)的版本号

networking上

这里有一些令人不满意的解决scheme([1]和其他教程/ Erlang文档):

模拟器

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

很难脚本。 我还没有find一种方法来从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}]. 

parsing天堂(与壳)。

替代scheme也可能是检查安装path,但这不是可移植的(我的安装path不包括版本,为一个)。

个人上下文:我正在编写一个脚本来在几台机器上安装与插件相同版本的RabbitMQ。 一些插件对OTP版本的要求很低,这就是这个问题的开始。

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

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

(我在这里添加了这个答案,因为我在过去的三个月里至lesssearch了3次)

从版本17.0开始,版本号erlang:system_info(otp_release). ,…)有一个新的格式,但erlang:system_info(otp_release). 只返回主版本号。

为了获得完整的版本号,有必要检查已经提到的releases文件夹下的OTP_RELEASE文件的内容。

 $ 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 

其他答案只显示OTP 17的主要版本(来自erlang:system_info的docs )。 这可以在我的开发机器上显示主要版本和次要版本:

 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 

这将从相应的文件中读取,如文档中所述 。

init文档 ,由'man erl'链接。

-eval Expr

在系统初始化期间扫描,分析和评估任意expression式Expr。 如果这些步骤中的任何一个失败(语法错误,parsing错误或评估过程中的exception),Erlang会停止并显示错误消息。 这是一个种子随机数发生器的例子:

 % erl -eval '{X,Y,Z} = now(), random:seed(X,Y,Z).' 

这个例子使用Erlang作为hex计算器:

 % erl -noshell -eval 'R = 16#1F+16#A0, io:format("~.16B~n", [R])' -s erlang halt BF 

如果指定了多个-evalexpression式,则会按照指定的顺序依次进行评估。 -evalexpression式用-s和-run函数调用(也按照指定的顺序)进行顺序评估。 与-s和-run一样,不终止的评估会阻止系统初始化过程。

从而,

 $ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt 

在/ usr / lib / erlang / releases / 18 / OTP_VERSION中find

erl + V或者你可以使用erl -version

结果:Erlang(SMP,ASYNC_THREADS)(BEAM)仿真器版本5.8.5

在PATH中finderl并读取RELEASES文件以提取erlang版本号。

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

打开terminal并input命令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版本

您可以使用:

 erlang:system_info(version). 

和/或:

 erlang:system_info(otp_release). 

在这里输入图像说明