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

时间:2012-03-05 02:06:26

标签: shell erlang

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

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

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

13 个答案:

答案 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).


enter image description here

答案 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