Erlang'ın sürüm numarasını bir kabuktan nasıl alabilirim?


108

Birçok program sürüm numaralarını aşağıdaki gibi bir komutla döndürür:

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

Bu, programın kurulumunu veya bakımını ve Sistem Yöneticileri ve arkadaşlarından bazı diğer kontrollü otomasyon sihrini komut dosyası oluşturmak için kullanışlıdır.

Sorun

Erlang (OTP) için sürüm numarasını kolayca nasıl alabilirim ?

İnternette

İşte bazı tatmin edici olmayan çözümler ([1] ve diğer eğitimler / Erlang belgeleri):

Emülatör

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

Senaryosu zor. erlBir kabuk isteminden tek bir komutu yürütmenin bir yolunu bulamadım .

Yayın dosyası

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

Ayrıştırma cenneti (kabuk ile).

Bir alternatif de yükleme yolunu kontrol etmek olabilir, ancak bu taşınabilir değildir (biri için yükleme yolum sürümü içermez).

Kişisel bağlam: Birkaç makineye eklentilerle aynı RabbitMQ sürümünü yüklemek için bir komut dosyası yazıyorum. Bazı eklentilerin OTP sürümüyle ilgili minimum gereksinimleri vardır ve bu soru bu şekilde başladı.

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


YAYINLAR hakkında bu kadar kötü olan ne? Erlang :-) tarafından önemsiz bir şekilde ayrıştırıldı
Julian Fondren

Ooops, bunda kötü bir şey yok! Gönderiyi bağlam için düzenledim. Erlang dizesini kabuk araçlarıyla çözümlemeyi kastetmiştim. Amacım, bir Erlang paketi için SA görevlerinin komut dosyası oluşturmaktır.
Eric Platon

Henüz Erlang sözdizimini anlamıyorum; Sadece kurulu sürümün Riak'ı destekleyip desteklemediğini kontrol etmek istiyorum. Bunu başrolde oynayarak ve Erlang'ın bir gün kendi sürümünü ona bağlı olan araçların yöneticilerine bildirmenin daha basit bir yolunu sunacağını umuyoruz.
Iain Samuel McLean Elder

erl --version.
Michael Dimmitt

Yanıtlar:


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

üzgünüm, bunu gönderirken daha kapsamlı bir önceki cevabı
görmedim

3
Bu (no error logger present) error: "Error in process <0.0.0>benim için Windows 7'ye yazdırılıyor . -1
Jonas

1
@andPat, öneriniz benim için erlang kabuğunun sürümünü döndürür (örneğin 7.0.2), erlang'ın kendisini değil ( 18benim durumumda).
gdw2

6
Erlang için dokümanlardan: system_info: OTP 17'den itibaren, OTP yayın numarası ana OTP sürüm numarasına karşılık gelir. Erlang: system_info () argümanı tam OTP sürümünü verir. Geliştirme makinemde küçük bir sürümü de yazdıran daha da çirkin bir komut için aşağıdaki cevabıma bakın.
Jay

2
Windows 7'de tek tırnakları çift tırnakla değiştirmek zorunda kaldım. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff

81

Diğer cevaplar yalnızca OTP 17'den itibaren ana sürümü gösterir ( erlang için belgelerden: system_info ). Bu, geliştirme makinemde büyük ve küçük sürümleri görüntülemek için çalışır:

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

Bu , belgelerde açıklandığı gibi uygun dosyadan okunur .


2
Teşekkürler, bu yararlıdır! Ayrıca, tırnak kurtulmak ve \nhem de sadece bir değişiklikle kodu kısaltmak: 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

Windows 7'de, tek tırnak işaretlerini çift tırnaklarla değiştirmek zorunda kaldım (veya tersi). 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

(Son üç ay içinde bunu en az 3 kez aradığım için bu yanıtı buraya ekliyorum)

17.0 sürümünden başlayarak sürüm numaralarında (17.0, 17.1, ...) yeni bir biçim bulunur ancak erlang:system_info(otp_release).yalnızca ana sürüm numarasını döndürür.

Tam sürüm numarasını almak için OTP_RELEASE, daha önce belirtilen releasesklasör altındaki dosyanın içeriğini kontrol etmek gerekir .

$ 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

DÜZENLE

# Some versions seem to have OTP_VERSION instead of OTP_RELEASE
$ cat releases/17/OTP_VERSION
17.4

Dosyayı açıklamanıza göre bulamıyorum, find / -name "OTP_RELEASE"görmüyorum ama OTP 17.x yüklü. "X" in ne olduğunu nasıl bilebilirim?
NobbZ

1
@NobbZ Cevabı ek bilgilerle güncelledim, yeni kontrol ettim ve yüklediğim mevcut Erlang / OTP sürümünde (17.4) dosya aslında çağrıldı OTP_VERSION.
juan.facorro

1
tek satır ilecat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0

14

init docs , 'man erl' ile bağlantılı.

-eval İfade

Sistem başlatma sırasında rastgele ifade Expr tarar, ayrıştırır ve değerlendirir. Bu adımlardan herhangi biri başarısız olursa (sözdizimi hatası, ayrıştırma hatası veya değerlendirme sırasında istisna), Erlang bir hata mesajıyla durur. Rastgele sayı oluşturucuyu tohumlayan bir örnek:

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

Bu örnek Erlang'ı onaltılık hesap makinesi olarak kullanır:

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

Çoklu değerlendirme ifadeleri belirtilirse, belirtilen sırayla sırayla değerlendirilirler. -eval ifadeleri, -s ve -run işlev çağrılarıyla sırayla değerlendirilir (bu da belirtilen sırayla). -S ve -run'da olduğu gibi, sonlandırmayan bir değerlendirme, sistem başlatma sürecini engeller.

Böylece,

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

Detaylar için teşekkür ederim Julian. evalKılavuzda anahtar kelimeyi aramayı nasıl unutabilirim ?
Eric Platon

12

EShell (Erlang Shell) sürümünü almak için şunları kullanabilirsiniz:

erlang:system_info(version).

ve Erlang OTP ( Açık Telekom Platformu ) sürümünü almak için:

erlang:system_info(otp_release).


görüntü açıklamasını buraya girin


2
En iyi cevap: Dileseniz de, sürüm işe yarardı.
Charlie

7

Bulmak /usr/lib/erlang/releases/18/OTP_VERSION


Bu işe yarıyor, evet. Sorudaki sürüm dosyası bölümüyle aynı , teklifinizin sorunu yükleme yolu hakkında bilgi sahibi olmasıdır. Buradaki fayda, tam sürümü almaktır. Benim için: 18.2.1.
Eric Platon

Bu dosya CentOS 7'de mevcut değil
Eduardo Cuomo

/usr/lib/erlang/releases - yanıtlanabilir aracılığıyla yüklendi
Olga

4

erl + V veya erl -version kullanabilirsiniz

sonuç: Erlang (SMP, ASYNC_THREADS) (BEAM) emülatörü sürüm 5.8.5


5
Bu erl, Erlang yayın sürüm numarasını değil (örneğin "R15B03") öykünücü sürümünü döndürür . Tüm bunlar çok kolay olabilir ;-)
Eric Platon

2

PATH'inizde erl'yi bulur ve erlang sürüm numarasını çıkarmak için RELEASES dosyasını okur.

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

1

Terminali açın ve erl komutunu girin

Aşağıdaki çıktıyı alacaksınız:

Erlang R16B03 (erts-5.10.4) [kaynak] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-anket: yanlış] Eshell V5.10.4 (^ G ile iptal)

Erlang R16B03 (erts-5.10.4) [kaynak] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-anket: false] - Bu dil sürümüdür

Eshell V5.10.4 (^ G ile iptal) - Bu, kabuk sürümüdür


1

Jay'in yukarıdaki cevabına dayanarak, kullanabileceğim aşağıdaki kabuk işlevini yazdım:

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
}

Sıklıkla komutun erlyerine olduğunu unutuyorum erlang, bu yüzden bu unutkan beynimin erlangsanki öyleymiş gibi kullanmasına izin veriyor erlve erlang -vbenzer bir şeyden bekleyeceğim gibi elixir.


-6

Kullanabileceğiniz basit bir komut:

erl --version

2
Bu komut kabuğa götürür. Soru, komut dosyası oluşturmak için sürümün nasıl alınacağıdır.
Eric Platon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.