Làm thế nào để lấy số phiên bản phát hành của Erlang từ một trình bao?


108

Nhiều chương trình trả về số phiên bản của chúng bằng lệnh như:

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

Điều này rất hữu ích cho việc tạo kịch bản cài đặt hoặc bảo trì chương trình và một số phép thuật tự động hóa có điều khiển khác từ Quản trị viên hệ thống và bạn bè.

Vấn đề

Làm cách nào để dễ dàng lấy số phiên bản cho Erlang (OTP) ?

Trên mạng

Dưới đây là một số giải pháp không đạt yêu cầu ([1] và các hướng dẫn / tài liệu Erlang khác):

Giả lập

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

Khó viết kịch bản. Tôi không tìm thấy cách nào để erlthực thi một lệnh duy nhất từ ​​dấu nhắc trình bao.

Phát hành tệp

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

Phân tích cú pháp thiên đường (có vỏ).

Một giải pháp thay thế cũng có thể là kiểm tra đường dẫn cài đặt, nhưng đó không phải là di động (đường dẫn cài đặt của tôi không bao gồm phiên bản, cho một).

Bối cảnh cá nhân: Tôi đang viết kịch bản để cài đặt cùng một phiên bản RabbitMQ với các plugin trên một số máy. Một số plugin có yêu cầu tối thiểu đối với phiên bản OTP và đó là cách mà câu hỏi này bắt đầu.

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


Có gì tệ về RELEASES? Nó được phân tích ngắn gọn bởi Erlang :-)
Julian Fondren

Rất tiếc, không có gì tệ với điều đó! Tôi đã chỉnh sửa bài đăng cho phù hợp với ngữ cảnh. Ý tôi là phân tích chuỗi Erlang bằng các công cụ shell. Mục tiêu của tôi là viết các tác vụ SA cho một gói Erlang.
Eric Platon

Tôi chưa hiểu cú pháp Erlang; Tôi chỉ muốn kiểm tra xem phiên bản đã cài đặt có hỗ trợ Riak hay không. Gắn dấu sao cho điều này và hy vọng rằng một ngày nào đó, Erlang sẽ cung cấp một cách đơn giản hơn để báo cáo phiên bản của nó cho quản trị viên của các công cụ phụ thuộc vào nó.
Iain Samuel McLean Elder,

erl --version.
Michael Dimmitt,

Câu trả lời:


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

xin lỗi không thấy câu trả lời trước toàn diện hơn khi tôi gửi nó
Odobenus rosmarus

3
Bản in này (no error logger present) error: "Error in process <0.0.0>trên Windows 7 cho tôi. -1
Jonas

1
@andPat, đề xuất của bạn trả về phiên bản của erlang shell cho tôi (ví dụ 7.0.2), không phải chính erlang ( 18trong trường hợp của tôi).
gdw2

6
Từ tài liệu cho erlang: system_info: Kể từ OTP 17, số phát hành OTP tương ứng với số phiên bản OTP chính. Không có đối số erlang: system_info () cung cấp phiên bản OTP chính xác. Xem câu trả lời của tôi bên dưới để biết một lệnh thậm chí còn xấu hơn cũng in phiên bản nhỏ trên máy phát triển của tôi.
Jay

2
Trên Windows 7, tôi phải thay thế các dấu nháy đơn bằng dấu nháy kép. erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
yohosuff

81

Các câu trả lời khác chỉ hiển thị phiên bản chính kể từ OTP 17 (từ tài liệu cho erlang: system_info ). Điều này hoạt động để hiển thị phiên bản chính và phụ trên máy phát triển của tôi:

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

Điều này đọc từ tệp thích hợp, như được mô tả trong tài liệu .


2
Cảm ơn, điều này rất hữu ích! Ngoài ra, bạn có thể thoát khỏi dấu ngoặc kép và \nvà cũng làm cho đoạn code ngắn hơn chỉ với một thay đổi: 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

Trên Windows 7, tôi phải hoán đổi dấu nháy đơn với dấu nháy kép (và ngược lại). 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

(Tôi đang thêm câu trả lời này ở đây vì tôi đã tìm kiếm câu trả lời này ít nhất 3 lần trong ba tháng qua)

Bắt đầu từ phiên bản 17.0, các bản phát hành có định dạng mới trong số phiên bản (17.0, 17.1, ...) nhưng erlang:system_info(otp_release).chỉ trả về số phiên bản chính.

Để có được số phiên bản đầy đủ, cần phải kiểm tra nội dung của OTP_RELEASEtệp trong releasesthư mục đã được đề cập .

$ 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

BIÊN TẬP

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

Tôi không tìm thấy tệp đó theo mô tả của bạn, find / -name "OTP_RELEASE"cũng không thấy nó, nhưng tôi đã cài đặt OTP 17.x. Làm thế nào tôi có thể biết "x" là gì?
NobbZ

1
@NobbZ Tôi đã cập nhật câu trả lời với thông tin bổ sung, tôi vừa kiểm tra và trong phiên bản Erlang / OTP hiện tại mà tôi đã cài đặt (17.4), tệp thực sự được gọi OTP_VERSION.
juan.facorro

1
với một dòngcat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
Lol4t0

14

init docs , được liên kết bởi 'man erl'.

-eval Expr

Quét, phân tích cú pháp và đánh giá một biểu thức tùy ý Expr trong quá trình khởi tạo hệ thống. Nếu bất kỳ bước nào trong số này không thành công (lỗi cú pháp, lỗi phân tích cú pháp hoặc ngoại lệ trong quá trình đánh giá), Erlang sẽ dừng lại với một thông báo lỗi. Dưới đây là một ví dụ về trình tạo số ngẫu nhiên:

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

Ví dụ này sử dụng Erlang làm máy tính thập lục phân:

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

Nếu các biểu thức nhiều -eval được chỉ định, chúng được đánh giá tuần tự theo thứ tự được chỉ định. biểu thức -eval được đánh giá tuần tự với các lệnh gọi hàm -s và -run (điều này cũng theo thứ tự được chỉ định). Như với -s và -run, một đánh giá không kết thúc, chặn quá trình khởi tạo hệ thống.

Vì vậy,

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

Cảm ơn bạn, Julian, về chi tiết. Làm thế nào tôi có thể quên tìm kiếm evaltừ khóa trong sách hướng dẫn?
Eric Platon

12

Để lấy phiên bản EShell (Erlang Shell), bạn có thể sử dụng:

erlang:system_info(version).

và để truy xuất phiên bản Erlang OTP ( Nền tảng viễn thông mở ):

erlang:system_info(otp_release).


nhập mô tả hình ảnh ở đây


2
Câu trả lời tốt nhất. Mặc dù bạn muốn - phiên bản sẽ hoạt động.
Charlie

7

Tìm trong /usr/lib/erlang/releases/18/OTP_VERSION


Điều đó hoạt động, có. Giống như phần tệp phát hành trong câu hỏi, vấn đề của đề xuất của bạn là nó giả định kiến ​​thức về đường dẫn cài đặt. Lợi ích ở đây là có được phiên bản đầy đủ. Đối với tôi: 18.2.1.
Eric Platon

Tệp này không tồn tại trên CentOS 7
Eduardo Cuomo

/usr/lib/erlang/releases - cài đặt thông qua ansible
Olga

4

erl + V hoặc bạn có thể sử dụng erl -version

kết quả: Phiên bản giả lập Erlang (SMP, ASYNC_THREADS) (BEAM) 5.8.5


5
Thao tác này trả về erlphiên bản giả lập, không phải số phiên bản phát hành Erlang (ví dụ: "R15B03"). Tất cả điều đó có thể dễ dàng như vậy ;-)
Eric Platon

2

Tìm erl trong PATH của bạn và đọc tệp RELEASES để trích xuất số phát hành erlang.

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

1

Mở terminal và nhập erl lệnh

Bạn sẽ nhận được kết quả sau:

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-thăm dò: false] Eshell V5.10.4 (hủy bằng ^ G)

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-thăm dò: false] - Đây là phiên bản ngôn ngữ

Eshell V5.10.4 (hủy bỏ với ^ G) - Đây là phiên bản shell


1

Dựa trên câu trả lời của Jay ở trên, tôi đã viết hàm shell sau mà tôi có thể sử dụng:

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
}

Tôi thường quên rằng lệnh thì erlđúng hơn erlang, vì vậy điều này cho phép bộ não đãng trí của tôi sử dụng erlangnhư thể nó vốn có erl, và erlang -vgiống như tôi mong đợi từ một điều gì đó tương tự elixir.


-6

Một lệnh đơn giản bạn có thể sử dụng:

erl --version

2
Lệnh này dẫn đến trình bao. Câu hỏi đặt ra là làm thế nào để chỉ lấy phiên bản, để viết kịch bản.
Eric Platon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.