간단한 쉘 스크립트로 배포 이름과 버전 번호를 어떻게 얻을 수 있습니까?


191

우분투 및 CentOS 배포판에서 실행할 수있는 간단한 bash 스크립트를 작성 중입니다 (Debian 및 Fedora / RHEL에 대한 지원은 플러스 일 것입니다). 스크립트가 실행중인 배포판의 이름과 버전을 알아야합니다 ( 리포지토리 생성과 같은 특정 작업을 트리거하기 위해). 지금까지 내가 얻은 것은 다음과 같습니다.

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $ARCH
echo $VERSION

이 작동, 반환 또는 것 같습니다ubuntucentos 릴리스 이름으로 (다른 사람을 시도하지 않은) . 그러나 나는 이것을 더 쉽고 신뢰할 수있는 방법으로 찾아야한다고 생각합니다. 맞습니까?

RedHat에서는 작동하지 않습니다. / etc / redhat-release는 다음을 포함합니다 : Redhat Linux Entreprise release 5.5

따라서 버전이 세 번째 단어가 아니므로 다음을 사용하는 것이 좋습니다.

OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"

확실하게 +-release작동합니까? 효과적으로 당신은 그것이 될 것이라고 가정하고 /etc/lsb-release있으므로 아마도 그것을 부르십시오.
Mikel

@Mikel : I 교체 *+주석 형식화하는을 피하기 위해, 그것은해야합니다 etc/*-release, 작동하는 것 같다.
Alix Axel

8
형식을 올바르게 지정하기 위해 구문 오류를 도입하지 마십시오. 또한 형식은 미리보기에서만 잘못되며 최종 뷰는 태그에서 구문을 선택합니다.
Gilles

왜 아무도이 fe를 언급하지 않고 uname -rv | grep -i "name_of_distro"종료 코드를 사용합니까?
도망자

답변:


182

얻으려면 OSVER최신 표준이 될 것으로 보인다 /etc/os-release. 그 전에, 거기 lsb_release/etc/lsb-release. 그 전에는 각 배포판마다 다른 파일을 찾아야했습니다.

여기 내가 제안하는 것이 있습니다.

if [ -f /etc/os-release ]; then
    # freedesktop.org and systemd
    . /etc/os-release
    OS=$NAME
    VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
    # linuxbase.org
    OS=$(lsb_release -si)
    VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then
    # For some versions of Debian/Ubuntu without lsb_release command
    . /etc/lsb-release
    OS=$DISTRIB_ID
    VER=$DISTRIB_RELEASE
elif [ -f /etc/debian_version ]; then
    # Older Debian/Ubuntu/etc.
    OS=Debian
    VER=$(cat /etc/debian_version)
elif [ -f /etc/SuSe-release ]; then
    # Older SuSE/etc.
    ...
elif [ -f /etc/redhat-release ]; then
    # Older Red Hat, CentOS, etc.
    ...
else
    # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
    OS=$(uname -s)
    VER=$(uname -r)
fi

나는 uname얻는 ARCH것이 여전히 가장 좋은 방법 이라고 생각 합니다 . 그러나 여러분이 제시 한 예는 분명히 인텔 시스템 만 다룹니다. 나는 BITS이것을 다음과 같이 부를 것이다 .

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

또는 변경 ARCH일반적인, 아직 모호 버전으로 : x86x64유사한 :

case $(uname -m) in
x86_64)
    ARCH=x64  # or AMD64 or Intel64 or whatever
    ;;
i*86)
    ARCH=x86  # or IA32 or Intel32 or whatever
    ;;
*)
    # leave ARCH as-is
    ;;
esac

물론 그것은 당신에게 달려 있습니다.


2
lsb_release를 확인하고 사용 가능한 경우 사용하지만 어디서나 사용할 수는 없습니다. 예를 들어, Fedora 14의 기본 설치에는 없습니다.
Steven D

정말? 당신은 그것을 철자 시도해 봤어 -_? 어쩌면 그런 식일 수도 있고 /lib/lsb어딘가에있을 수도 있습니다 . 무엇을 rpm -qa "lsb*"인쇄합니까?
Mikel

1
rpm -qa "lsb*아무것도 인쇄하지 않습니다. 그것에 따르면 yum provides */lsb_releaseredhat-lsb라는 패키지에 포함되어 있으며 기본적으로 설치되지 않은 것 같습니다. 그러나 저는 Fedora 전문가가 아닙니다. 이것은 내가 가지고있는 임의의 Fedora VM의 결과이며 매우 잘못되었을 수 있습니다.
Steven D

3
방금 Fedora 14를 VM에 설치했는데 아무 말도 없습니다 lsb-release.
Mikel

5
사용하지 마십시오 $OS, $VERSION등 - 규칙에 따라, 우리는 환경 변수 (호출기, 에디터, SHELL, ...) 및 내부 쉘 변수를 대문자 (BASH_VERSION, RANDOM, ...). 다른 모든 변수 이름에는 하나 이상의 소문자가 포함되어야합니다. 이 규칙은 실수로 환경 및 내부 변수를 무시하지 않도록합니다.
Chris Down

58

나는 이것을 첫 번째 단계로 진행할 것입니다.

ls /etc/*release

Gentoo, RedHat, Arch & SuSE에는 eg라는 파일이 /etc/gentoo-release있습니다. 인기가있는 것 같습니다.이 사이트에서 release-files를 확인 하십시오 .

데비안 및 우분투 /etc/lsb-release에는 릴리스 정보가 포함되어 있어야 하며 이전 명령과 함께 표시됩니다.

또 다른 빠른 방법은 uname -rv입니다. 설치된 커널이 stock distro 커널 인 경우, 보통 거기에 이름이 있습니다.


데비안에서는 uname -a.
tshepang

2
uname -rv정보 가 포함되어 있지 않습니까? uname -a여기서는 관련이없는 프로세서 유형 및 호스트 이름과 같은 것을 인쇄합니다. (그러나 커널 릴리스 ( -r)와 버전 ( -v)이 모두 필요합니다. 모든 배포판에서 동일하게 수행하는 것은 아닙니다)
Mat

uname -r 은 데비안 6에서 제공 2.6.32-5-686-bigmem하고 uname -v 는 제공합니다 . uname -a OTOH가 제공합니다 . #1 SMP Tue Mar 8 22:14:55 UTC 2011Linux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux
tshepang

두 번째 부분 uname -a이다 -n, 즉 노드 이름 == 호스트. 그래서 나는 말할 것 uname데비안에 흥미되지 않습니다. 그것을 생각해 보니, 그것이 RedHat에서도 그렇게 유용하다는 것을 확신하지 못합니다.
Mat

오 그래. 따라서 호스트 이름을 기본값으로 설정 한 것은 운이 좋은 것입니다 debian.
tshepang

36

lsb_release -a. 데비안에서 작동하며 우분투를 추측하지만 나머지는 확실하지 않습니다. 일반적으로 LSB (Linux Standard Base)와 관련되어 있기 때문에 모든 GNU / Linux 배포판에 존재해야합니다.


3
젠투에는 기본적으로 설치되어 있지 않습니다. 그것은 어느 시점에서나 페도라에서 기본적으로 아니 었습니다 (아마도 지금은 가능합니다)
Mat

2
이것은 Debian squeeze, Fedora 14 및 OpenSUSE 11.3에서 작동했습니다. 데비안과 SUSE에서 lsb_release를 포함하는 패키지는 lsb-release이고, Fedora에서는 redhat-lsb였습니다. 이미 데비안과 SUSE에 설치되었지만 Fedora에는 설치되지 않았습니다. 나는 이것이 지금까지 가장 좋은 대답이라고 생각합니다. +1.
Faheem Mitha

3
lsb_release는 CentOS 6 최소 설치의 일부가 아닙니다.
코더

1
lsb_release -aRaspbian ( Debian 7.1 파생)이있는 Raspberry에서 "-bash : lsb_release : command not found"를 반환합니다 .
피터 Mortensen

lsb_release 레드햇 엔터프라이즈 리눅스 서버에서 작동 -a는 6.6 (산티아고) 해제
jwilleke

21

하나의 라이너, 폴백, 한 줄의 출력, 오류 없음.

lsb_release -ds 2>/dev/null || cat /etc/*release 2>/dev/null | head -n1 || uname -om

감사합니다 이것은 여전히 ​​Mac OS X에서는 작동하지 않지만 Ubuntu 및 CentOS (내가 편리한 세 가지)에서는 잘 작동합니다.
와일드 카드

2
훌륭한! 왜 그런 bueatiful 대답이 정상에 있지 않습니까?
Neo


9
  1. lsb- * 가 설치되지 않았 거나 기본 CentOS 또는 데비안 시스템에 존재하지 않습니다
  2. / proc / * 는 OSX에 존재하지 않습니다

자바 스크립트 개발자로부터 팁을 얻으십시오. 버전을 테스트하지 말고 기능을 테스트하십시오. 예쁘지는 않지만 작동합니다. 필요에 따라 확장하십시오.

function os_type
{
case `uname` in
  Linux )
     LINUX=1
     which yum && { echo centos; return; }
     which zypper && { echo opensuse; return; }
     which apt-get && { echo debian; return; }
     ;;
  Darwin )
     DARWIN=1
     ;;
  * )
     # Handle AmgiaOS, CPM, and modified cable modems here.
     ;;
esac
}  

6
Yum은 Red Hat, Scientific Linux 또는 Fedora 일 수 있습니다. Fedora에서 데비안을 모방 한 적절한 명령이있었습니다. 등등. CentOS가 Red Hat 4에서 Fedora 18에 이르는 다양한 지원 시스템을 제공하기 때문에 yum으로 무엇이든 정리하면됩니다. <foo>가 지원되는지 알아야하는 경우, (신뢰할 수없는) 배포 식별을 기반으로 추측하는 대신 <foo>를 확인하십시오! 물론, 그것은 autotools의 ilk로 이어지지 만 도움이 될 수는 없습니다 (Unix 전쟁이 끝난 $ DEITY에게 감사드립니다).
vonbrand

@vonbrand는 실제로 당신이 말하는 것과 같습니다. 하위 맛을 구별하려고 시도하지 않습니다. 그리고 많은 수의 연구를하지는 않았지만 체크인 순서는 (가장 희망이있는) 대부분의 까다로운 상황을 제거합니다. RHEL이 apt-get을 설치할 수 있고 Ubuntu 사용자가 yum을 가지고 있다면 운이 좋지 않습니다.
Orwellophile

6

가장 가능한 성공을 거두려면 다음을 수행하십시오.

cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv

대부분의 경우 (AFAIK) : 데비안, 우분투, 슬랙웨어, 수세, 레드햇, 젠투, * BSD 등.


cat /etc/*versionCentOS (적어도 6.4 이상)에서 작동하지 않습니다 (최소 6.4 이상)
om-nom-nom

컨테이너에서 명령을 실행하면 / proc / version에는 컨테이너 배포 버전이 아닌 HOST 배포 버전이 포함됩니다.
Dereckson

5

대부분의 최신 Linux OS 시스템에서 파일 /etc/os-release은 실제로 표준이되어 대부분의 OS에 포함됩니다. 따라서 Bash 스크립트 안에 파일을 포함시킬 수 있으며 여기에 설명 된 모든 변수에 액세스 할 수 있습니다 (예 : NAME, VERSION, ...)에 .

그래서 나는 이것을 Bash 스크립트에서 사용하고 있습니다 :

if [ -f /etc/os-release ]
then
        . /etc/os-release
else
        echo "ERROR: I need the file /etc/os-release to determine what my distribution is..."
        # If you want, you can include older or distribution specific files here...
        exit
fi

3

파일 /etc/debian_version이 존재하면 배포판은 데비안 또는 데비안 파생물입니다. 이 파일에는 릴리스 번호가있을 수 있습니다. 내 컴퓨터에는 현재6.0.1 입니다. 테스트 중이거나 불안정한 경우, 테스트 중 / 안정적이라고 말하거나 다음 릴리스 수를 가질 수 있습니다. 내 인상은 적어도 우분투 에서이 파일은 항상 테스트 / 불안정하고 릴리스 번호를 넣지 않았지만 내가 틀렸다면 누군가 나를 교정 할 수 있다는 것입니다.

Fedora (최소 릴리스)는 비슷한 파일, 즉을 갖습니다 /etc/fedora-release.


최신 데비안 버전은 / etc / os-release를 대신 사용합니다.
Dereckson

1
@Dereckson 나는 wheezy 컴퓨터를 확인했으며 모두 /etc/debian_version와를 가지고 있습니다 /etc/os-release.
Faheem Mitha

debootstrap으로 만든 Jessie chroot에서 테스트되었습니다. 그러나 실제로 Jessie의 로컬 시스템에도 이번에는보다 일반적인 방식으로 설치되어 /etc/debian_version파일이 포함되어 있습니다. 따라서 데비안 설치를 준비하는 방법은 사용 가능한 릴리즈 파일에 영향을 줄 수 있습니다.
Dereckson

데비안 os-release에는의 정식 버전 번호가 포함되어 있지 않습니다 debian_version. unix.stackexchange.com/questions/382531을 참조하십시오 .
JdeBP


1

많은 것에서 2 가지 방법 :

1) 사용

lsb_release -a

CentOS 5.5 및 Ubuntu 10.04에서 테스트했습니다.

CentOS의 출력은 다음과 같습니다.

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch 
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

우분투의 경우 :

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

2) 다음 명령을 입력하십시오.

cat /etc/*-release

CentOS 5.5 및 Ubuntu 10.04에서 테스트했으며 정상적으로 작동합니다.


lsb_release은 (최소가 FWIW를 설치)에 CentOS 6에 있지
코더

lsb_release -aRaspbian ( Debian 7.1 파생)이있는 Raspberry에서 "-bash : lsb_release : command not found"를 반환합니다 .
피터 Mortensen

0

이 스크립트는 데비안에서 작동합니다 (우분투에서 약간의 조정이 필요할 수 있습니다)

#!/usr/bin/env bash

echo "Finding Debian/ Ubuntu Codename..."

CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}

echo "$CODENAME"
# => saucy, precise, lucid, wheezy, squeeze

0

다음은 간단한 chech_distro 버전입니다. ^^;

#!/usr/bin/env bash
check_distro2(){
    if [[ -e /etc/redhat-release ]]
    then
      DISTRO=$(cat /etc/redhat-release)
    elif [[ -e /usr/bin/lsb_release ]]
    then
      DISTRO=$(lsb_release -d | awk -F ':' '{print $2}')
    elif [[ -e /etc/issue ]]
    then
      DISTRO=$(cat /etc/issue)
    else
      DISTRO=$(cat /proc/version)
    fi
    }

    check_distro2
    echo $DISTRO

0

버전이 없으면 dist 만 :

cat /etc/issue | head -n +1 | awk '{print $1}'

Yahya Yahyaoui의 1 년 전의 답변도 마찬가지입니다. 이 답변은 실제로 2011 년에 삭제 된 답변으로 해결되었습니다. 그들이 틀린 이유가 여전히 적용됩니다.
JdeBP

0

이것은 Ubuntu 14 및 CentOS 7에서 테스트되었습니다.

cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'

@don_crissti 어떻게 하시겠습니까?
BsdHelper

sed -n -e '/PRETTY_NAME/ s/^.*=\|"\| .*//gp' /etc/os-release
cas

@cas 아주 좋은! 내 도구 상자에 추가하십시오. 공유해 주셔서 감사합니다.
BsdHelper

0

여기 에서 일반적인 리눅스 배포판에 사용할 수있는 좋은 스크립트 가 있습니다 .

#! /bin/bash
# return an awkable string consisting of
#    unix OS type, or
#    Linux dist, or
#    a long guess (based on /proc), or
#    no clue

giveUp () {
   echo "Unknown"
   exit 0
}

# keep this easily awkable, prepending an initial clue
versionGuess () {
   if [ -e /proc/version ]; then
      echo -n "Unsure "
      cat /proc/version
      exit 0
   fi
   return 1
}

# if we have ignition, print and exit
gotDist () {
   [ -n "$1" ] && echo "$1" && exit 0
}

# we are only interested in a single word "dist" here
# various malformations can occur; admin will have to code appropately based on output
linuxRelease () {
   if [ -r /etc/lsb-release ]; then
      dist=$(grep 'DISTRIB_ID' /etc/lsb-release | sed 's/DISTRIB_ID=//' | head -1)
      gotDist "$dist"
   fi

   dist=$(find /etc/ -maxdepth 1 -name '*release' 2> /dev/null | sed 's/\/etc\///' | sed 's/-release//' | head -1)
   gotDist "$dist"

   dist=$(find /etc/ -maxdepth 1 -name '*version' 2> /dev/null | sed 's/\/etc\///' | sed 's/-version//' | head -1)
   gotDist "$dist"

   return 1
}

# start with uname and branch the decision from there
dist=$(uname -s 2> /dev/null)
if [ "$dist" = "Linux" ]; then
   linuxRelease
   versionGuess
   giveUp
elif [ -n "$dist" ]; then
   echo "$dist"
   exit 0
else
   versionGuess
   giveUp
fi

# we shouldn't get here
giveUp
# done


0

있습니다 facter의 당신에게 운영 체제의 OS에 대한 몇 가지 사실을 제공 루비 보석, 그것은 터미널 화면에 OS 릴리스 파일, 기타 데이터 및 인쇄를 분석. rubygems 설치로 시작하여 다음과 같이 시도 할 수 있습니다.

# apt-get install rubygems

OS에 적합한 위의 사례를 사용하십시오. 그런 다음 gem 자체를 설치하십시오.

# gem install facter

그런 다음 사용하십시오.

$ facter

참고 : 설치에 대한 자세한 정보는 실제 gem 소스를 참조하십시오.


0

누군가가 배포판을 필요로하는 경우 :

#!/usr/bin/env bash

LINUX_VERSION_NAME=`lsb_release -sr`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "18.04" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

산출:

It is: 18.04

배포판을 얻으려면 lsb_release -sc로 변경하십시오.

LINUX_VERSION_NAME=`lsb_release -sc`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "bionic" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

산출:

It is: bionic

-3

이 명령은 데비안 기반 배포 및 Redhat 기반 배포에 적용됩니다. tr필터를 사용 하면 문서를 한 줄에 한 단어 형식으로 변환 한 다음 배포 이름이 포함 된 첫 번째 줄을 계산합니다.

tr -s ' \011' '\012' < /etc/issue | head -n 1

2011 년에 삭제 된 동일한 답변에 대한 의견이 여전히 적용됩니다. 잘못 배치 된 답변과 /etc/issue마찬가지로 zenwalk에 버전이나 이름이 포함되어 있지 않다고 다시 삭제되었습니다 . 이 파일은 프로그래밍 방식으로 꺼낼 수있는 내용 이 포함되어 있다고 보장 할 수 없는 메시지를 포함하는 관리자 수정 가능 파일 입니다.
JdeBP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.