Bagaimana cara mendapatkan nomor versi rilis Erlang dari shell?

108

Banyak program mengembalikan nomor versinya dengan perintah seperti:

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

Ini berguna untuk membuat skrip instalasi atau pemeliharaan program, dan beberapa keajaiban otomasi terkontrol lainnya dari Admin Sistem & teman.

Masalah

Bagaimana cara mudah mendapatkan nomor versi Erlang (OTP) ?

Di internet

Berikut adalah beberapa solusi yang tidak memuaskan ([1] dan tutorial / dokumentasi Erlang lainnya):

Emulator

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

Sulit untuk ditulis. Saya belum menemukan cara untuk erlmenjalankan satu perintah dari prompt shell.

File rilis

$ 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}].

Surga parsing (dengan cangkang).

Alternatifnya juga dapat memeriksa jalur pemasangan, tetapi itu tidak portabel (jalur pemasangan saya tidak menyertakan versinya, untuk satu).

Konteks pribadi: Saya menulis skrip untuk menginstal versi RabbitMQ yang sama dengan plugin di beberapa mesin. Beberapa plugin memiliki persyaratan minimal pada versi OTP, dan begitulah pertanyaan ini dimulai.

[1] http://forum.trapexit.org/viewtopic.php?p=42946

Eric Platon
sumber
Apa buruknya RELEASES? Ini diuraikan secara sepele oleh Erlang :-)
Julian Fondren
Ups, tidak ada yang buruk dengan itu! Saya mengedit postingan untuk konteksnya. Maksud saya mem-parsing string Erlang dengan alat shell. Tujuan saya adalah membuat skrip tugas SA untuk paket Erlang.
Eric Platon
Saya belum mengerti sintaks Erlang; Saya hanya ingin memeriksa apakah versi yang terinstal mendukung Riak atau tidak. Membintangi ini dan berharap suatu hari Erlang akan memberikan cara yang lebih sederhana untuk melaporkan versinya ke administrator alat yang bergantung padanya.
Iain Samuel McLean Elder
erl --version.
Michael Dimmitt

Jawaban:

153
 erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().'  -noshell
Odobenus Rosmarus
sumber
maaf tidak melihat jawaban sebelumnya yang lebih komprehensif ketika saya mempostingnya
Odobenus Rosmarus
3
Ini mencetak (no error logger present) error: "Error in process <0.0.0>pada Windows 7 untuk saya. -1
Jonas
1
@andPat, saran Anda mengembalikan versi shell erlang untuk saya (misalnya 7.0.2), bukan erlang itu sendiri ( 18, dalam kasus saya).
gdw2
6
Dari dokumen untuk erlang: system_info: Mulai dari OTP 17, nomor rilis OTP sesuai dengan nomor versi OTP utama. Tidak ada argumen erlang: system_info () yang memberikan versi OTP yang tepat. Lihat jawaban saya di bawah untuk perintah yang lebih jelek yang juga mencetak versi minor pada mesin pengembangan saya.
Jay
2
Di Windows 7, saya harus mengganti tanda kutip tunggal dengan tanda kutip ganda. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff
81

Jawaban lain hanya menampilkan versi utama pada OTP 17 (dari docs untuk erlang: system_info ). Ini berfungsi untuk menampilkan versi mayor dan minor di mesin pengembangan saya:

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

Ini membaca dari file yang sesuai, seperti yang dijelaskan di dokumen .

Jay
sumber
2
Terima kasih, ini berguna! Juga, Anda dapat menyingkirkan tanda kutip dan \ndan juga membuat kode lebih pendek dengan hanya satu perubahan: 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
Di Windows 7, saya harus menukar tanda kutip tunggal dengan tanda kutip ganda (dan sebaliknya). 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
yohosuff
38

(Saya menambahkan jawaban ini di sini karena saya telah mencari ini setidaknya 3 kali dalam tiga bulan terakhir)

Mulai dari rilis versi 17.0 memiliki format baru dalam nomor versinya (17.0, 17.1, ...) tetapi erlang:system_info(otp_release).hanya mengembalikan nomor versi mayor.

Untuk mendapatkan nomor versi lengkap, Anda perlu memeriksa konten OTP_RELEASEfile di bawah releasesfolder yang telah disebutkan .

$ 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
juan.facorro
sumber
Saya tidak menemukan file itu dengan deskripsi Anda, find / -name "OTP_RELEASE"juga tidak melihatnya, tetapi saya telah menginstal OTP 17.x. Bagaimana saya bisa tahu apa itu "x"?
NobbZ
1
@NobbZ Saya memperbarui jawaban dengan info tambahan, saya baru saja memeriksa dan dalam versi Erlang / OTP saat ini saya telah menginstal (17.4) file tersebut sebenarnya dipanggil OTP_VERSION.
juan.facorro
1
dengan satu bariscat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0
14

dokumen init , ditautkan oleh 'man erl'.

-eval Expr

Memindai, mengurai, dan mengevaluasi ekspresi sembarang Ekspr selama inisialisasi sistem. Jika salah satu dari langkah ini gagal (kesalahan sintaks, kesalahan parse atau pengecualian selama evaluasi), Erlang berhenti dengan pesan kesalahan. Berikut adalah contoh yang menyemai generator bilangan acak:

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

Contoh ini menggunakan Erlang sebagai kalkulator heksadesimal:

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

Jika beberapa ekspresi -eval ditentukan, ekspresi tersebut dievaluasi secara berurutan dalam urutan yang ditentukan. Ekspresi -eval dievaluasi secara berurutan dengan pemanggilan fungsi -s dan -run (ini juga dalam urutan yang ditentukan). Seperti dengan -s dan -run, evaluasi yang tidak berhenti, memblokir proses inisialisasi sistem.

Jadi,

$ erl -noshell -eval 'io:fwrite("~s\n", [erlang:system_info(otp_release)]).' -s erlang halt
Julian Fondren
sumber
Terima kasih, Julian, untuk detailnya. Bagaimana saya bisa lupa mencari evalkata kunci di manual?
Eric Platon
12

Untuk mengambil versi EShell (Erlang Shell), Anda dapat menggunakan:

erlang:system_info(version).

dan untuk mengambil versi Erlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


masukkan deskripsi gambar di sini

Miloud Eloumri
sumber
2
Jawaban terbaik Meskipun Anda ingin --versi akan berhasil.
Charlie
7

Temukan di /usr/lib/erlang/releases/18/OTP_VERSION

Sener DEMIRAL
sumber
Itu berhasil, ya. Sama seperti bagian file rilis dalam pertanyaan, masalah proposal Anda adalah mengasumsikan pengetahuan tentang jalur penginstalan. Manfaatnya di sini adalah mendapatkan versi lengkap. Bagi saya: 18.2.1.
Eric Platon
File ini tidak ada di CentOS 7
Eduardo Cuomo
/usr/lib/erlang/releases - diinstal melalui ansible
Olga
4

erl + V atau Anda dapat menggunakan erl -version

hasil: emulator Erlang (SMP, ASYNC_THREADS) (BEAM) versi 5.8.5

shrikant
sumber
5
Ini mengembalikan erlversi emulator, bukan nomor versi rilis Erlang (misalnya "R15B03"). Semua itu bisa sangat mudah ;-)
Eric Platon
2

Menemukan erl di PATH Anda dan membaca file RELEASES untuk mengekstrak nomor rilis erlang.

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

Buka terminal dan masukkan perintah erl

Anda akan mendapatkan hasil sebagai berikut:

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

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp: 4: 4] [async-threads: 10] [kernel-poll: false] - Ini adalah versi bahasa

Eshell V5.10.4 (batalkan dengan ^ G) - Ini adalah versi shell

akhileshnair.dll
sumber
1

Berdasarkan jawaban Jay di atas, saya menulis fungsi shell berikut yang dapat saya gunakan:

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
}

Saya sering lupa bahwa perintahnya adalah erlalih-alih erlang, jadi ini membuat otak saya yang pelupa menggunakannya erlangseolah-olah erl, dan erlang -vseperti yang saya harapkan dari sesuatu seperti elixir.

Josh Smith
sumber
-6

Perintah sederhana yang dapat Anda gunakan:

erl --version
Jeremie Ges
sumber
2
Perintah ini mengarah ke shell. Pertanyaannya adalah bagaimana mendapatkan versi, untuk skrip.
Eric Platon