จะรับหมายเลขเวอร์ชันรีลีสของ Erlang จากเชลล์ได้อย่างไร


108

หลายโปรแกรมส่งคืนหมายเลขเวอร์ชันด้วยคำสั่งเช่น:

$ 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


มีอะไรเลวร้ายเกี่ยวกับการเปิดตัว? Erlang :-)
Julian Fondren

อ๊ะไม่มีอะไรเลวร้ายกับสิ่งนั้น! ฉันแก้ไขโพสต์สำหรับบริบท ฉันหมายถึงการแยกวิเคราะห์สตริง Erlang ด้วยเครื่องมือกะลา เป้าหมายของฉันคือสคริปต์งาน SA สำหรับแพ็คเกจ Erlang
Eric Platon

ฉันยังไม่เข้าใจไวยากรณ์ของ Erlang ฉันแค่ต้องการตรวจสอบว่าเวอร์ชันที่ติดตั้งรองรับ Riak หรือไม่ ติดดาวสิ่งนี้และหวังว่าสักวัน Erlang จะมอบวิธีที่ง่ายกว่าในการรายงานเวอร์ชันให้กับผู้ดูแลระบบของเครื่องมือที่ขึ้นอยู่กับมัน
Iain Samuel McLean เอ็ลเดอร์

erl - รุ่น
Michael Dimmitt

คำตอบ:


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 ที่แน่นอน ดูคำตอบของฉันด้านล่างสำหรับคำสั่งที่น่าเกลียดยิ่งกว่าที่พิมพ์เวอร์ชันรองลงมาในเครื่องพัฒนาของฉัน
Jay

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

นี้อ่านจากไฟล์ที่เหมาะสมตามที่อธิบายไว้ในเอกสาร


2
ขอบคุณสิ่งนี้มีประโยชน์! นอกจากนี้คุณยังสามารถได้รับการกำจัดของคำพูดและและยังทำให้รหัสสั้นมีเพียงการเปลี่ยนแปลงที่หนึ่ง:\n 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 ฉันต้องสลับคำพูดเดี่ยวกับเครื่องหมายคำพูดคู่ (และในทางกลับกัน) 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

(ฉันกำลังเพิ่มคำตอบที่นี่เนื่องจากฉันได้ค้นหาสิ่งนี้อย่างน้อย 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
มีสายเดียวcat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0

14

เริ่มต้นเอกสารที่เชื่อมโยงโดย 'man erl'

นิพจน์ -eval

สแกนแยกวิเคราะห์และประเมินนิพจน์ตามอำเภอใจระหว่างการเริ่มต้นระบบ หากขั้นตอนเหล่านี้ล้มเหลว (ข้อผิดพลาดทางไวยากรณ์ข้อผิดพลาดในการแยกวิเคราะห์หรือข้อยกเว้นระหว่างการประเมินผล) Erlang จะหยุดพร้อมกับข้อความแสดงข้อผิดพลาด นี่คือตัวอย่างที่เมล็ดกำเนิดเครื่องกำเนิดตัวเลขสุ่ม:

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

ตัวอย่างนี้ใช้ Erlang เป็นเครื่องคำนวณเลขฐานสิบหก:

% 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

ขอบคุณ Julian สำหรับรายละเอียด ฉันจะลืมค้นหาevalคำสำคัญในคู่มือได้อย่างไร
Eric Platon

12

ในการดึงข้อมูลเวอร์ชัน EShell (Erlang Shell) คุณสามารถใช้:

erlang:system_info(version).

และในการดึงข้อมูลเวอร์ชั่นErlang OTP ( Open Telecom Platform ):

erlang:system_info(otp_release).


ใส่คำอธิบายภาพที่นี่


2
คำตอบที่ดีที่สุดแม้ว่าคุณจะต้องการ - เวอร์ชันจะได้ผล
Charlie

7

ค้นหาใน /usr/lib/erlang/releases/18/OTP_VERSION


ได้ผลใช่ เช่นเดียวกับส่วนไฟล์รีลีสในคำถามปัญหาของข้อเสนอของคุณคือถือว่ามีความรู้เกี่ยวกับเส้นทางการติดตั้ง ประโยชน์ที่นี่คือการได้รับเวอร์ชันเต็ม สำหรับฉัน: 18.2.1.
Eric Platon

ไฟล์นี้ไม่มีอยู่ใน CentOS 7
Eduardo Cuomo

/usr/lib/erlang/releases - ติดตั้งผ่าน
Olga

4

erl + V หรือคุณสามารถใช้ erl -version

ผลลัพธ์: Erlang (SMP, ASYNC_THREADS) (BEAM) emulator เวอร์ชัน 5.8.5


5
สิ่งนี้ส่งคืนerlเวอร์ชันอีมูเลเตอร์ไม่ใช่หมายเลขเวอร์ชันของ Erlang รีลีส (เช่น "R15B03") ทั้งหมดนั้นอาจง่ายมาก ;-)
Eric Platon

2

ค้นหา erl ใน PATH ของคุณและอ่านไฟล์ 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) [source] [64-bit] [smp: 4: 4] [async-threads: 10] [kernel-Poll: false] Eshell V5.10.4 (ยกเลิกด้วย ^ G)

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp: 4: 4] [async-threads: 10] [kernel-Poll: false] - นี่คือเวอร์ชันภาษา

Eshell V5.10.4 (ยกเลิกด้วย ^ G) - นี่คือเวอร์ชันเชลล์


1

จากคำตอบของ Jay ข้างต้นฉันได้เขียนฟังก์ชันเชลล์ต่อไปนี้ที่ฉันสามารถใช้ได้:

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 -velixir


-6

คำสั่งง่ายๆที่คุณสามารถใช้ได้:

erl --version

2
คำสั่งนี้นำไปสู่เชลล์ คำถามคือจะรับเวอร์ชันสำหรับการเขียนสคริปต์ได้อย่างไร
Eric Platon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.