许多程序使用如下命令返回其版本号:
$ program --version
program (platform info) v1.2.3
Run Code Online (Sandbox Code Playgroud)
这对于编写程序的安装或维护脚本以及系统管理员和朋友的一些其他受控自动化魔法非常有用.
如何轻松获取Erlang(OTP)的版本号?
以下是一些令人不满意的解决方案([1]和其他教程/ Erlang文档):
模拟器
$ erl
1> erlang:system_info(otp_release).
"R13B03"
Run Code Online (Sandbox Code Playgroud)
难以编写脚本.我还没有找到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}].
Run Code Online (Sandbox Code Playgroud)
解析天堂(带壳).
另一种方法也可以是检查安装路径,但这不是可移植的(我的安装路径不包括版本).
个人情境:我正在编写一个脚本,在几台机器上安装相同版本的RabbitMQ插件.有些插件对OTP版本的要求很低,这就是问题的起源.
Odo*_*rus 144
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
Run Code Online (Sandbox Code Playgroud)
Jay*_*Jay 65
其他答案仅显示OTP 17的主要版本(来自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
Run Code Online (Sandbox Code Playgroud)
jua*_*rro 33
(我在这里添加了这个答案,因为我在过去的三个月内至少搜索了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
Run Code Online (Sandbox Code Playgroud)
编辑
# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4
Run Code Online (Sandbox Code Playgroud)
Jul*_*ren 14
初始文档,由'man erl'链接.
-eval Expr
在系统初始化期间扫描,解析和评估任意表达式Expr.如果这些步骤中的任何一个失败(语法错误,解析错误或评估期间的异常),Erlang将停止并显示错误消息.以下是种子随机数生成器的示例:
% erl -eval '{X,Y,Z} = now(), random:seed(X,Y,Z).'
Run Code Online (Sandbox Code Playgroud)
此示例使用Erlang作为十六进制计算器:
% erl -noshell -eval 'R = 16#1F+16#A0, io:format("~.16B~n", [R])' -s erlang halt
BF
Run Code Online (Sandbox Code Playgroud)
如果指定了多个-eval表达式,则按指定的顺序依次计算它们.-eval表达式使用-s和-run函数调用顺序计算(这也按指定的顺序).与-s和-run一样,不终止的评估会阻止系统初始化过程.
从而,
$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Run Code Online (Sandbox Code Playgroud)
Mil*_*mri 11
要检索EShell(Erlang Shell)版本,您可以使用:
erlang:system_info(version).
Run Code Online (Sandbox Code Playgroud)
并检索Erlang OTP(开放电信平台)版本:
erlang:system_info(otp_release).
Run Code Online (Sandbox Code Playgroud)