How to get Erlang's release version number from a shell?
Asked Answered
E

12

135

Many programs return their version number with a command like:

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

This is useful for scripting the installation or maintenance of the program, and some other controlled automation magic from System Admins and friends.

Problem

How to easily get the version number for Erlang (OTP)?

On the net

Here are some unsatisfactory solutions (from the trapexit forum and other tutorials/Erlang documentation):

Emulator

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

Hard to script. I have not found a way to have erl execute a single command from a shell prompt.

Release file

$ 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 paradise (with shell).

An alternative could also be checking the install path, but that is not portable (my install path does not include the version, for one).

Personal context: I am writing a script to install the same version of RabbitMQ with plugins on several machines. Some plugins have minimal requirements on the OTP version, and it is how this question started.

Embryonic answered 5/3, 2012 at 2:6 Comment(4)
What's so bad about RELEASES? It's trivially parsed by Erlang :-)Giulia
Ooops, nothing bad with that! I edited the post for the context. I meant parsing the Erlang string with shell tools. My goal is to script SA tasks for an Erlang package.Embryonic
I don't understand Erlang syntax yet; I just want to check whether the installed version supports Riak or not. Starring this and hoping that one day Erlang will provide a simpler way to report its version to administrators of tools that depend on it.Becquerel
erl --version .Actinic
N
178
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Narcosis answered 5/3, 2012 at 3:46 Comment(7)
sorry didn't see more comprehensive previous answer when I post itNarcosis
This prints (no error logger present) error: "Error in process <0.0.0> on Windows 7 for me. -1Mercer
@Mercer try werl instead of erlParamagnetic
For precise version run: erl -eval 'erlang:display(erlang:system_info(version)), halt().' -noshellDaemon
@andPat, your suggestion returns the version of the erlang shell for me (e.g. 7.0.2), not erlang itself (18, in my case).Melanie
From the docs for erlang:system_info: As from OTP 17, the OTP release number corresponds to the major OTP version number. No erlang:system_info() argument gives the exact OTP version. See my answer below for an even uglier command that also prints minor version on my development machine.Kotta
On Windows 7, I had to replace the single quotes with double quotes. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshellKimmy
K
127

The other answers only display major version as of OTP 17 (from docs for erlang:system_info). This works to display major and minor version on my development machine:

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

This reads from the appropriate file, as described in the docs.

Kotta answered 17/12, 2015 at 3:57 Comment(2)
Thanks, this is useful! Also, you can get rid of the quotes and \n and also make the code shorter with just one change: 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.Rhinoceros
On Windows 7, I had to swap single quotes with double quotes (and vice versa). erl -eval "{ok, Version} = file:read_file(filename:join([code:root_dir(), 'releases', erlang:system_info(otp_release), 'OTP_VERSION'])), io:fwrite(Version), halt()." -noshellKimmy
H
53

(I'm adding this answer here since I've searched for this at least 3 times in the past three months)

Starting from version 17.0 releases have a new format in their version number (17.0, 17.1, ...) but erlang:system_info(otp_release). only returns the major version number.

In order to get the full version number it is necessary to check the contents of the OTP_RELEASE file under the already mentioned releases folder.

$ 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
Hypophosphate answered 11/12, 2014 at 19:48 Comment(3)
I don't find that file by your description, find / -name "OTP_RELEASE" doesn't see it either, but I have OTP 17.x installed. How am I able to know what "x" is?Wernher
@Wernher I updated the answer with additional info, I just checked and in the current Erlang/OTP version I have installed (17.4) the file is actually called OTP_VERSION.Hypophosphate
with one line cat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*Modernistic
C
21

To retrieve EShell (Erlang Shell) version, you may use:

erlang:system_info(version).

and to retrieve Erlang OTP (Open Telecom Platform) version:

erlang:system_info(otp_release).


enter image description here

Chrisman answered 5/2, 2017 at 18:1 Comment(1)
The best answer.Though you'd wish --version would work.Velocity
G
14

init docs, linked by 'man erl'.

-eval Expr

Scans, parses and evaluates an arbitrary expression Expr during system initialization. If any of these steps fail (syntax error, parse error or exception during evaluation), Erlang stops with an error message. Here is an example that seeds the random number generator:

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

This example uses Erlang as a hexadecimal calculator:

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

If multiple -eval expressions are specified, they are evaluated sequentially in the order specified. -eval expressions are evaluated sequentially with -s and -run function calls (this also in the order specified). As with -s and -run, an evaluation that does not terminate, blocks the system initialization process.

Thus,

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Giulia answered 5/3, 2012 at 3:42 Comment(1)
Thank you, Julian, for the detail. How could I forget to search the eval keyword in the manual?Embryonic
P
8

Find in /usr/lib/erlang/releases/18/OTP_VERSION

Pop answered 5/1, 2016 at 20:0 Comment(3)
That works, yes. Same as the release file section in the question, the problem of your proposal is that it assumes knowledge of the install path. The benefit here is to get the full version. For me: 18.2.1.Embryonic
This file isn't exists on CentOS 7Eyeopener
/usr/lib/erlang/releases - installed via ansibleCurren
P
4

erl +V or you can use erl -version

result : Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.8.5

Perineurium answered 14/6, 2013 at 18:16 Comment(1)
This returns the erl emulator version, not the Erlang release version number (e.g. "R15B03"). All that could be so easy ;-)Embryonic
S
3

Based on Jay's answer above, I wrote the following shell function that I can use:

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
}

I often forget that the command is erl rather than erlang, so this lets my forgetful brain just use erlang as if it were erl, and erlang -v like I would expect from something like elixir.

Sonora answered 9/5, 2019 at 10:43 Comment(0)
W
2

Finds the erl in your PATH and reads the RELEASES file to extract the erlang release number.

awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
When answered 31/12, 2013 at 6:44 Comment(0)
K
2

Open terminal and enter command erl

You will get the following output:

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false] Eshell V5.10.4 (abort with ^G)

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false] - This is the language version

Eshell V5.10.4 (abort with ^G) - This is the shell version

Knightly answered 20/4, 2016 at 10:8 Comment(0)
M
-5

I ran the updates for the systems and works

sudo apt-get update
sudo apt-get upgrade
Mclellan answered 26/3, 2021 at 19:32 Comment(0)
P
-10

A simple command you can use:

erl --version
Prentiss answered 1/12, 2017 at 4:50 Comment(1)
This command leads to the shell. The question is how to just get the version, for scripting.Embryonic

© 2022 - 2024 — McMap. All rights reserved.