web-dev-qa-db-ja.com

シェルからErlangのリリースバージョン番号を取得する方法は?

多くのプログラムは、次のようなコマンドでバージョン番号を返します。

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

これは、プログラムのインストールまたはメンテナンスのスクリプト作成、およびシステム管理者や友人からのその他の自動化マジックに役立ちます。

問題

Erlang(OTP)のバージョン番号を簡単に取得するには

ネット上

いくつかの不十分な解決策を以下に示します([1]およびその他のチュートリアル/ Erlangドキュメント):

エミュレーター

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

スクリプトを作成するのは難しい。 erlにシェルプロンプトから単一のコマンドを実行させる方法を見つけていません。

リリースファイル

$ 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

100
Eric Platon
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
141

他の回答では、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

ドキュメント で説明されているように、これは適切なファイルから読み取ります。

63
Jay

(過去3か月間に少なくとも3回これを検索したため、ここにこの回答を追加しています)

バージョン17.0以降では、バージョン番号に新しい形式(17.0、17.1、...)がありますが、erlang:system_info(otp_release).はメジャーバージョン番号のみを返します。

完全なバージョン番号を取得するには、前述のreleasesフォルダーの下のOTP_RELEASEファイルの内容を確認する必要があります。

$ 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
32
juan.facorro

init docs 、「man erl」でリンクされています。

-eval Expr

システムの初期化中に任意の式Exprをスキャン、解析、評価します。これらの手順のいずれかが失敗した場合(構文エラー、解析エラー、または評価中の例外)、Erlangはエラーメッセージで停止します。乱数ジェネレーターをシードする例は次のとおりです。

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

この例では、16進数の計算機としてErlangを使用しています。

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

複数の-eval式が指定されている場合、指定された順序で順番に評価されます。 -eval式は、-sおよび-run関数呼び出しで順次評価されます(これも指定された順序で)。 -sおよび-runと同様、終了しない評価はシステム初期化プロセスをブロックします。

副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example、

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
14
Julian Fondren

EShell(Erlang Shell)バージョンを取得するには、次を使用できます。

erlang:system_info(version).

erlang OTP( Open Telecom Platform )バージョンを取得するには:

erlang:system_info(otp_release).


enter image description here

10
Miloud Eloumri

/usr/lib/erlang/releases/18/OTP_VERSIONで検索

5
Sener DEMIRAL

erl + Vまたはerl -versionを使用できます

結果:Erlang(SMP、ASYNC_THREADS)(BEAM)エミュレーターバージョン5.8.5

4
shrikant

PATHでerlを見つけ、RELEASESファイルを読み取ってerlangリリース番号を抽出します。

awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
2
taylorcc

上記のジェイの回答に基づいて、使用できる次のシェル関数を作成しました。

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であるかのようにerlerlang -vのように使うだけです。 elixirのようなものに期待しています。

1
Josh Smith

ターミナルを開き、コマンドerlを入力します

次の出力が得られます。

Erlang R16B03(erts-5.10.4)[ソース] [64ビット] [smp:4:4] [async-threads:10] [kernel-poll:false] Eshell V5.10.4(^で中止G)

Erlang R16B03(erts-5.10.4)[ソース] [64ビット] [smp:4:4] [async-threads:10] [kernel-poll:false] -これは言語バージョンです =

Eshell V5.10.4(^ Gで中止)-これはシェルバージョンです

1
akhileshnair

使用できる簡単なコマンド:

erl --version
0
Jeremie Ges

rebarがインストールされている場合、これを実行します。

$ rebar3 --version

結果:rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5

0
Ukr