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


108

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

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

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

問題

簡単アーラン(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


RELEASESの何が悪いのですか?Erlangによって簡単に解析されます:-)
Julian Fondren

おっと、悪いことは何もありません。コンテキストに合わせて投稿を編集しました。シェルツールでErlang文字列を解析することを意味しました。私の目標は、ErlangパッケージのSAタスクをスクリプト化することです。
Eric Platon、2012年

私はまだErlang構文を理解していません。インストールされているバージョンがRiakをサポートしているかどうかを確認したいだけです。これを主導し、いつかErlangがそれに依存するツールの管理者にバージョンを報告する簡単な方法を提供することを期待しています。
Iain Samuel McLean Elder

回答:


153
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell

申し訳ありませんが、投稿時に以前のより包括的な回答は表示されませんでした
Odobenus Rosmarus

3
これ(no error logger present) error: "Error in process <0.0.0>はWindows 7で印刷されます。-1
ジョナス

1
@andPat、あなたの提案は私のためにerlang シェルのバージョン(例えば7.0.2)を返し、erlang自体(18私の場合は)を返しません。
gdw2

6
erlang:system_infoのドキュメントから:OTP 17以降と同様に、OTPリリース番号はメジャーOTPバージョン番号に対応しています。erlang:system_info()引数は、正確なOTPバージョンを示しません。開発マシンでマイナーバージョンも出力するさらに醜いコマンドについては、以下の私の回答を参照してください。
ジェイ

2
Windows 7では、一重引用符を二重引用符に置き換える必要がありました。erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff

81

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

docsで説明されいるようにこれは適切なファイルから読み取ります。


2
ありがとう、これは便利です!また、引用符を取り除き、\n1つの変更だけでコードを短くすることもできます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
Dogbert、2016年

Windows 7では、一重引用符と二重引用符を入れ替える必要がありました(逆も同様です)。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
ヨホサフ2018年

38

(過去3か月間に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

あなたの説明でfind / -name "OTP_RELEASE"はそのファイルは見つかりませんが、それも表示されませんが、OTP 17.xがインストールされています。「x」が何であるかをどのように知ることができますか?
NobbZ

1
@NobbZ追加情報で回答を更新しました。チェックしたところ、現在インストールされているErlang / OTPバージョン(17.4)で、ファイルは実際に呼び出されていOTP_VERSIONます。
juan.facorro

1
1行でcat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0 2015年

14

'man erl'によってリンクされたinit docs

-eval Expr

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

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

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

% 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

詳細については、ジュリアンさん、ありがとうございました。evalマニュアルでキーワードを検索し忘れることはありますか?
エリックプラトン

12

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

erlang:system_info(version).

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

erlang:system_info(otp_release).


ここに画像の説明を入力してください


2
最良の答えですが、あなたは望んでいますが、バージョンは機能します。
チャーリー

7

で見つける /usr/lib/erlang/releases/18/OTP_VERSION


そうです、はい。質問のリリースファイルセクションと同じですが、提案の問題は、インストールパスの知識を前提としていることです。ここでの利点は、完全版を入手できることです。私の場合:18.2.1
Eric Platon、2016年

このファイルはCentOS 7には存在しません
Eduardo Cuomo 2018年

/usr/lib/erlang/releases -ansible経由でインストール
Olga

4

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

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


5
これは、erlErlangのリリースバージョン番号ではなく、エミュレータのバージョンを返します(例: "R15B03")。とても簡単かもしれません;-)
Eric

2

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

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

1

端末を開き、コマンド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

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

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、そしてerlang -v私のようなものから期待のようにelixir


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.