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.
How to easily get the version number for Erlang (OTP)?
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.
The latest version of Erlang/OTP is 25.0. 3.
If you want the latest Erlang version on Ubuntu, you can add the repository offered by Erlang Solutions. They provide prebuilt binaries for various Linux distributions, Windows and macOS. If you had installed a package named erlang previously, it will be upgraded to the newer version offered by the added repository.
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
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.
(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
EDIT
# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4
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).
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
Find in /usr/lib/erlang/releases/18/OTP_VERSION
erl +V or you can use erl -version
result : Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.8.5
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
.
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"
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With