Ubuntu 배포판의 전체 코드 이름을 얻는 방법은 무엇입니까?


33
$ lsb_release -c
Codename:   trusty

$ cat /etc/issue
Ubuntu 14.04 LTS \n \l

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

위 명령의 출력에는 부분 코드 이름 (예 :) 만 표시됩니다 trusty. 설치된 Ubuntu 시스템 의 전체 코드 이름 ( 신뢰할 수있는 tahr )은 어떻게 얻 습니까?


1
파일 소싱 을 향한 수렴 프로세스가있는 것 같습니다 /etc/os-release. 어쩌면 당신은 당신이 무엇을 의미하는 지정해야 내 설치된 우분투 시스템의 전체 코드 명 (신뢰할 수있는 tahr)을 어떻게합니까? . 터미널에서만 에코를 원하십니까, 아니면 변수에 할당해야합니까? 이것은 비 {Ubuntu, Debian} 이외의 시스템에서 사용됩니까?
gniourf_gniourf

답변:


43

외부 도구를 사용하지 않는 경우 :

당신은 단지 source (source 명령은 dot .) /etc/os-release를 할 수 있으며 거기에 정의 된 모든 변수에 액세스 할 수 있습니다 :

$ . /etc/os-release
$ echo "$VERSION"
14.04, Trusty Tahr

편집하다. 14.04,terdon의 요청에 따라 부품 을 제거하려는 경우 다음을 수행 할 수 있습니다.

$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
Trusty Tahr

다른 배포판에서는 VERSION필드의 형식이 다를 수 있기 때문에이 방법은 약간 복잡 합니다. 예를 들어, 데비안에서

$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
(wheezy)

그런 다음 스크립트에서 다음과 같은 것을 상상할 수 있습니다.

#!/bin/bash

if [[ -r /etc/os-release ]]; then
    . /etc/os-release
    if [[ $ID = ubuntu ]]; then
        read _ UBUNTU_VERSION_NAME <<< "$VERSION"
        echo "Running Ubuntu $UBUNTU_VERSION_NAME"
    else
        echo "Not running an Ubuntu distribution. ID=$ID, VERSION=$VERSION"
    fi
else
    echo "Not running a distribution with /etc/os-release available"
fi

1
(에코 내장되어 있음) 그러나 괜찮습니다 . /etc/os-release && echo ${VERSION//[0-9,. ]/ }.
terdon

1
@terdon 고양이를 껍질을 벗기는 방법은 여러 가지가 있습니다 ;D.
gniourf_gniourf

모든 의견은 어떻게 되었습니까?
gniourf_gniourf

2
많은 것이 있고 당신은 특히 좋은 것입니다! 실제 답변과 관련이없는 설명은 경고없이 삭제할 수 있습니다.
terdon

8

이미 제공되는 것에 대한 나의 변형 :

. /etc/os-release; echo ${VERSION/*, /}

현재까지 가장 짧은 Bashiest 답변입니다.

/etc/os-release현재 환경에의 내용 을로드하지 않아도 되는 경우 스크립트를 상당히 쉽게로드한다고 생각하여 bash를 가짜로 만들 수 있습니다.

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')

3
지금까지 다른 어떤 것보다 더 바쁘게 말 합니까? 여기에 다른 전체 배쉬 답변이 있습니다 :D.
gniourf_gniourf

왜 공감해야합니까? 좋은 대답입니다 (앞서 주어진 다른 것과 개념적으로 다르지 않지만).
gniourf_gniourf

2
허, 프로세스 대체의 영리한 사용, +1.
terdon

마스터 @terdon에서 기대할 수 있듯이 :)
Rinzwind

1
간단한 서브 쉘이 작업을 수행합니다 ( . /etc/os-release && echo ${VERSION/*, /} ).
gniourf_gniourf

5

그렙 :

$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr

설명:

  • lsb_release -rs -> 설치된 Ubuntu 버전을 인쇄합니다.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> 릴리스 버전이 포함 된 모든 줄을 가져 오십시오. 제 경우에는 14.04입니다.

  • grep -m 1 "Description: Ubuntu "-> 다시 -m문자열을 포함하는 일치하는 첫 번째 줄 ( 플래그 때문에) 만 가져옵니다 Description: Ubuntu.

  • cut -d "'" -f2 -> 구분 기호 작은 따옴표에 따라 필드 번호 2를 인쇄합니다. '

Awk :

$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr

설명:

awk에서 변수 선언 및 할당은 -v매개 변수를 통해 수행됩니다. 따라서 lsb_release -rs 명령 값이 변수 var4에 인쇄됩니다. 이 변수 는 줄 4에서 필드 5, 필드 5를 인쇄하는 데 도움이되며 문자열을 14.04발견하면 존재 cut합니다. 작은 따옴표를 제거하십시오.


4

찾고있는 명령은 다음과 같습니다.

grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release

이것은 매우 추악 하고 최적화되지 않았습니다. 더 쉬운 방법이 있어야하며 여기에는 몇 가지 문제가 있습니다.


1
. /etc/os-release 
echo $VERSION

3
여전히 숫자를 제거해야합니다. 아래에서 @gniourf_gniourf의 답변을 참조하십시오.
terdon

1

더 많은 선택이 있습니다. 그들은 모두 /etc/os-release내 13.10에서 다음과 같은 파일을 구문 분석합니다 .

NAME="Ubuntu"
VERSION="13.10, Saucy Salamander"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.10"
VERSION_ID="13.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

아래의 모든 솔루션은 두 번째 줄을 구문 분석하여 생성 Saucy Salamander합니다.

  1. grep

    grep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
    

    -o수단과는 "라인의 일치하는 부분 인쇄" -P펄 호환 정규 표현식을 가능하게합니다. 이것은 우리가 사용할 수 있습니다 \K와 함께 그 시점까지 일치 된 어떤 폐기하는 -o수단 "과 일치하는 내용 만 인쇄 \K . 그래서이 포함 된 행의 마지막 두 단어와 일치합니다 사용 된 실제 정규 표현식 VERSION=.

  2. awk

    awk -F'[" ]' '/VERSION=/{print $3,$4}'  /etc/os-release
    

    에 필드 구분 기호를 설정 "하고 space포함하는 행의 3d 및 4rth 필드는 것을 의미 VERSION=우리가 후하고있는 문자열입니다.

  3. sed

    sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
    

    -n스위치를 억제 정상 출력은 어떤 라인이 인쇄되지 않는다. 는 -r정규 표현식을 확장 허용한다. 그런 다음 일치하는 행 VERSION=에서 마지막 두 단어를 제외한 모든 단어를 삭제합니다. p마지막 수단 인쇄에서.

  4. perl

    perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
    

    ' -n는'로 지정된 스크립트를 사용하여 모든 입력 행을 처리합니다 -e. " -l는 모든 인쇄 호출 (및 여기에 관련되지 않은 다른 항목)에 개행 문자를 추가합니다. 정규식은 마지막 두 단어 ( \b단어 경계)와 일치합니다. 행에가 포함되어 있으면 인쇄합니다 VERSION=.

  5. coreutils

    grep VERSION= /etc/os-release | cut -d ' ' -f 2-  | tr -d '"' 
    

    여기서는 grep관련 줄만 사용 cut하고 필드 구분 기호를 space( -d ' ')로 설정 하고 두 번째 필드에서 줄 끝까지 모든 것을 인쇄합니다. tr -d명령은 삭제됩니다 "끝에서.

  6. 순수한 껍질 (@gniourf_gniourf의 영리한 source아이디어를 부끄럽게 훔치는 ) :

    . /etc/os-release && echo ${VERSION//[0-9,. ]/ }
    

    .소스는 쉘과 I 사용 bash는의에 변수를 사용할 수 있도록 파일 문자열 조작 기능은 버전 번호를 제거합니다.


1

정규식을 사용하면 다음과 같이 할 수 있습니다.

grep 'VERSION' /etc/os-release | grep -oP "[a-zA-Z]+ [a-zA-Z]+"

설명:

VERSION파일에서 줄을 검색 합니다 /etc/os-release. 그런 다음 공백으로 분리 된 2 개의 연속 단어를 찾습니다 (Perl regex). -o 플래그는 검색과 일치하는 항목 만 유지합니다.

[a-zA-Z]숫자를 포함하지 않으려면`w` 대신 사용해야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.