如何从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).