多くのプログラムは、次のようなコマンドでバージョン番号を返します。
$ 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バージョンに最小限の要件があり、それがこの質問の始まりです。
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
他の回答では、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
ドキュメント で説明されているように、これは適切なファイルから読み取ります。
(過去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
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
EShell(Erlang Shell)バージョンを取得するには、次を使用できます。
erlang:system_info(version).
erlang OTP( Open Telecom Platform )バージョンを取得するには:
erlang:system_info(otp_release).
/usr/lib/erlang/releases/18/OTP_VERSION
で検索
erl + Vまたはerl -versionを使用できます
結果:Erlang(SMP、ASYNC_THREADS)(BEAM)エミュレーターバージョン5.8.5
PATHでerlを見つけ、RELEASESファイルを読み取ってerlangリリース番号を抽出します。
awk -F, 'NR==1 {gsub(/"/,"",$3);print $3}' "$(dirname $(readlink -f $(which erl)))/../releases/RELEASES"
上記のジェイの回答に基づいて、使用できる次のシェル関数を作成しました。
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
のようなものに期待しています。
ターミナルを開き、コマンド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で中止)-これはシェルバージョンです
使用できる簡単なコマンド:
erl --version
rebarがインストールされている場合、これを実行します。
$ rebar3 --version
結果:rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5