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

Eri*_*ton 104 shell erlang

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

$ 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版本的要求很低,这就是问题的起源.

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

Odo*_*rus 144

 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Run Code Online (Sandbox Code Playgroud)

  • 我想知道为什么它必须是这个神秘的? (40认同)
  • 从来自OTP 17的erlang:system_info:_As的文档中,OTP版本号对应于主要的OTP版本号.没有erlang:system_info()参数给出了确切的OTP版本._请参阅下面的答案,获得一个更加丑陋的命令,该命令也会在我的开发机器上打印次要版本. (6认同)
  • 这打印`(没有错误记录器存在)错误:"Windows 7上的进程<0.0.0>`错误.1 (3认同)
  • 在Windows 7上,我不得不用双引号替换单引号。erl -eval“ erlang:display(erlang:system_info(otp_release)),halt()。” -无壳` (2认同)

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)

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

  • 谢谢,这很有用!此外,您可以删除引号和`\n`,并且只需更改一次即可缩短代码:`erl -eval'{ok,Version} = file:read_file(filename:join([code:root_dir() ,"release",erlang:system_info(otp_release),"OTP_VERSION"])),io:fwrite(Version),halt().' -noshell`. (2认同)

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)

  • 一行 `cat $(dirname $(dirname \`which erl\`)/$(readlink \`which erl\`))/../releases/*/OTP_*` (3认同)
  • @NobbZ我用附加信息更新了答案,我刚刚检查过,在我安装的当前Erlang/OTP版本(17.4)中,该文件实际上称为“OTP_VERSION”。 (2认同)

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)


在此输入图像描述

  • 最佳答案尽管您希望--version可以工作。 (2认同)

小智 5

找到 /usr/lib/erlang/releases/18/OTP_VERSION