쉘에서 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


RELEASES의 나쁜 점은 무엇입니까? 그것은 하찮게 :-) 얼랑에 의해 구문 분석 있어요
줄리안 Fondren을

죄송합니다. 나는 맥락을 위해 게시물을 편집했습니다. 쉘 도구로 Erlang 문자열을 구문 분석하는 것을 의미했습니다. 내 목표는 Erlang 패키지에 대한 SA 작업을 스크립팅하는 것입니다.
에릭 플라톤

아직 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
Jonas

1
@andPat, 귀하의 제안은 erlang 자체가 아닌 (예 :) erlang 버전을 반환합니다 . 7.0.218
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 2016-10-09

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 개월 동안 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 2015-06-28

14

init docs , 'man erl'로 링크 됨.

-eval Expr

시스템 초기화 중에 임의의 표현식 Expr을 스캔, 구문 분석 및 평가합니다. 이러한 단계 중 하나라도 실패하면 (구문 오류, 구문 분석 오류 또는 평가 중 예외) Erlang은 오류 메시지와 함께 중지됩니다. 다음은 난수 생성기를 시드하는 예입니다.

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

이 예에서는 Erlang을 16 진수 계산기로 사용합니다.

% 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 2012 년

12

EShell (Erlang Shell) 버전을 검색하려면 다음을 사용할 수 있습니다.

erlang:system_info(version).

Erlang OTP ( Open Telecom Platform ) 버전 을 검색하려면 :

erlang:system_info(otp_release).


여기에 이미지 설명 입력


2
가장 좋은 대답은 원 하겠지만 --version이 작동 할 것입니다.
Charlie

7

찾기 /usr/lib/erlang/releases/18/OTP_VERSION


네, 작동합니다. 질문 의 릴리스 파일 섹션과 마찬가지로 제안의 문제는 설치 경로를 알고 있다고 가정한다는 것입니다. 여기서의 이점은 정식 버전을 얻는 것입니다. 나를 위해 : 18.2.1.
Eric Platon

이 파일은하지에 CentOS 7에 존재한다
에두아르도 쿠 오모

/usr/lib/erlang/releases -ansible을 통해 설치
Olga

4

erl + V 또는 erl -version을 사용할 수 있습니다.

결과 : Erlang (SMP, ASYNC_THREADS) (BEAM) 에뮬레이터 버전 5.8.5


5
그러면 erlErlang 릴리스 버전 번호 (예 : "R15B03")가 아닌 에뮬레이터 버전 이 반환 됩니다. ;-) 너무 쉽게 할 수있는 모든
에릭 플라톤

2

PATH에서 erl을 찾고 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) [소스] [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로 중단) -쉘 버전입니다.


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 -v내가 좋아하는 뭔가를 기대하는 것처럼 elixir.


-6

사용할 수있는 간단한 명령 :

erl --version

2
이 명령은 쉘로 연결됩니다. 문제는 스크립팅을 위해 버전을 얻는 방법입니다.
Eric Platon 2017
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.