programing

쉘에서 Erlang의 릴리스 버전 번호를 얻는 방법은 무엇입니까?

nasanasas 2020. 8. 17. 09:07
반응형

쉘에서 Erlang의 릴리스 버전 번호를 얻는 방법은 무엇입니까?


많은 프로그램이 다음과 같은 명령을 사용하여 버전 번호를 반환합니다.

$ 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


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

다른 답변은 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

문서에 설명 된대로 적절한 파일에서 읽습니다 .


(지난 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

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

If multiple -eval expressions are specified, they are evaluated sequentially in the order specified. -eval expressions are evaluated sequentially with -s and -run function calls (this also in the order specified). As with -s and -run, an evaluation that does not terminate, blocks the system initialization process.

Thus,

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

To retrieve EShell (Erlang Shell) version, you may use:

erlang:system_info(version).

and to retrieve Erlang OTP (Open Telecom Platform) version:

erlang:system_info(otp_release).


enter image description here


Find in /usr/lib/erlang/releases/18/OTP_VERSION


erl +V or you can use erl -version

result : Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.8.5


Finds the erl in your PATH and reads the RELEASES file to extract the erlang release number.

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

Open terminal and enter command erl

You will get the following output:

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

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false] - This is the language version

Eshell V5.10.4 (abort with ^G) - This is the shell version


Based on Jay's answer above, I wrote the following shell function that I can use:

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
}

I often forget that the command is erl rather than erlang, so this lets my forgetful brain just use erlang as if it were erl, and erlang -v like I would expect from something like elixir.


If you have rebar installed do this:

$ rebar3 --version

result: rebar 3.6.1 on Erlang/OTP 21 Erts 10.0.5


A simple command you can use:

erl --version

참고URL : https://stackoverflow.com/questions/9560815/how-to-get-erlangs-release-version-number-from-a-shell

반응형