Bash 스크립트에서 OS를 감지하는 방법은 무엇입니까?


525

내가 사용하는 모든 컴퓨터에서 사용할 수 있도록 내 파일 .bashrc과 .bash_login파일을 버전 관리 상태로 유지하고 싶습니다 . 문제는 일부 OS 관련 별칭이 있으므로 스크립트가 Mac OS X, Linux 또는 Cygwin 에서 실행되고 있는지 확인하는 방법을 찾고 있다는 것 입니다.

Bash 스크립트 에서 운영 체제를 감지하는 올바른 방법은 무엇입니까 ?


1
구성 공유를 고려한 적이 있습니까? 나는 같은 종류의 설정을 원했습니다 :)
— sorin

@sorin 나는 그것이 오래된 의견이라는 것을 알고 있지만, 여전히 궁금하다면, 모든 컴퓨터에 대해 플러그 가능한 bash 환경을 구성 할 수있는 ProfileGem 을 구축 하고 있습니다.
— dimo414

1
@ dimo414 profilegem은 여기 bitbucket.org/dimo414/profilegem 로 옮겨 간 것 같습니다 . 일반적으로 bash 구성을 공유하는 한 다음과 같은 일부 도트 파일 프로젝트를 사용해보십시오. github.com/…
— mahemoff

1
@mahemoff 업데이트 된 링크에 감사드립니다. 내 의견을 편집 할 수 없습니다. ProfileGem을 실험하고 있다면 피드백이나 버그를 환영합니다!
— dimo414

Alas BitBucket은 Mercurial 지원을 중단하고 있으므로 링크를 다시 업데이트해야합니다. ( github.com/dimo414/ProfileGem 은 새 집입니다.
— dimo414

답변:


521

다음과 같이 작동한다고 생각합니다. win32그래도 확실하지 않습니다 .

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

7
Windows에서, 당신은 얻을 것이다 msys힘내 배쉬 / msysGit,과 cygwinCygwin을 위해
— friederbluemle

1
Windows를 감지하는 방법을 포함하여이 답변이 좋습니다. 나는 또한 Mingw32를 사용하고 있으며msys
— d48

2
흥미로운 .. Mac OSX는 여전히 'darwin'을 제공 할 것입니다.
— jonathanbell

6
주석을 명령으로 대체 할 때 나를 놀라게 한 것이 있습니다-로 끝나십시오 ;.
— Vadim Peretokin 2016 년

1
와 같은 명령을 추가하면 source somefile ; 얻을 수 syntax error near unexpected token elif있습니다.
— oarfish

292

내 .bashrc에는 다음 코드를 사용합니다.

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

그런 다음 다음과 같은 작업을 수행합니다.

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

추악하지만 작동합니다. 원하는 경우 case대신 사용할 수 있습니다 if.


6
unamestr을 사용하는 대신 unamestr에서 플랫폼을 설정하는 이유는 무엇입니까?
— csexton

80
백틱을 사용하지 말고 더 새로운 구문 인 "unamestr = $ (uname)"을 사용하십시오.
— 언 와인드

15
요약하면, 백틱은 문자열과 유사 할 수 있습니다.
— 해리슨 전원

29
@ 데이비드 - winiecki 때문에 당신은 둥지에 필요한 경우 명령 예를 들어 $ (명령 1 $ (명령-2))
— 마이클 바턴

4
그렇게하는 것이 훨씬 낫지 않을 것입니다 : platform="$(uname | tr '[:upper:]' '[:lower:]')"그렇다면 분명히 사건을 처리합니까? 매우 구체적인 출력에 대한 종속성을 하드 코딩하는 것은 이상하게 보입니다.
— Brandon Buck

274

bash 맨 페이지에는 변수 OSTYPE에 운영 체제 이름이 저장되어 있다고 나와 있습니다.

OSTYPEbash가 실행중인 운영 체제를 설명하는 문자열로 자동 설정됩니다. 기본값은 시스템에 따라 다릅니다.

여기로 설정되어 linux-gnu있습니다.


5
또한 $ OSTYPE은 내 Mac (Leopard)에서 'darwin9.0'이고 Cygwin에서 'cygwin'입니다.
— dF.

5
$ OSTYPE은 SnowLeopard에서 darwin10.0입니다. 버전이 추가 된 WTF? 간단한 사례 진술이 작동하지 않음을 의미합니다.
— mxcl 2009

16
그것을 제거하는 것은 그렇게 큰 거래가 아닙니다 :os=${OSTYPE//[0-9.]/}
— ABach

86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
— tripleee

36
@tripleee 또는 "if"구문에 더 익숙한 사람들을 위해 :if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
— Rican7

158

$OSTYPE

미리 정의 된 $OSTYPE변수를 간단히 사용할 수 있습니다 . 예 :

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

그러나 이전 쉘 (예 : Bourne 쉘 ) 에서는 인식되지 않습니다 .


uname

또 다른 방법은 uname명령을 기반으로 플랫폼을 감지하는 것 입니다.

다음 스크립트를 참조하십시오 (.bashrc에 포함 가능).

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

내 실제 사례를 찾을 수 있습니다.bashrc .


Travis CI에 사용 된 유사한 버전은 다음과 같습니다 .

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac

1
$ OSTYPE 검사에 cygwin의 분기가 누락되어 Windows 시스템을 나타냅니다. cygwin uname은 "CYGWIN_NT-10.0"을 반환하고 MinGW uname은 "MINGW64_NT-10.0"을 반환합니다.
— 매트 페닝 턴

1
별칭 ls = '/ bin / ls -G'는 실제로 안전한 옵션입니다. OS 기반 fags의 맥락에서 superuser.com/a/1299969/84662
— Andrei Neculau

나는 uname오라클을 사용하는 것이 좋겠다고 제안 하고 무료 버전 문자열을 넣었습니다 OSTYPE ==> solaris2.11. uname조금 더 깨끗하고해야 할 일이 적습니다.
— 것입니다

37

검출 운영 체제 및 CPU 타입은 너무 쉽게 할 수없는 이식 . 나는 sh매우 다양한 Unix 플랫폼에서 작동하는 약 100 줄 의 스크립트를 가지고 있습니다 : 1988 년 이래로 사용한 시스템.

핵심 요소는

  • uname -p입니다 프로세서 유형 하지만 일반적으로 unknown현대 유닉스 플랫폼에서.

  • uname -m 일부 유닉스 시스템에서 "기계 하드웨어 이름"을 제공합니다.

  • /bin/arch존재하는 경우 일반적으로 프로세서 유형을 제공합니다.

  • uname 인수가 없으면 운영 체제 이름이 지정됩니다.

결국 플랫폼 간의 차이점과 플랫폼을 얼마나 잘 만들고 싶어하는지 생각 해야합니다. 예를 들어, 단지 물건을 간단하게 유지하기 위해, 나는 치료 i386를 통해 i686, 어떤 " Pentium*"및 " AMD*Athlon*"모든으로 x86.

내 ~/.profile시작시 스크립트를 실행하여 하나의 변수를 CPU와 운영 체제의 조합을 나타내는 문자열로 설정합니다. 나는 플랫폼 별이가 bin, man, lib, 및 include설정받을 디렉토리를 그 기반으로. 그런 다음 환경 변수의 보트로드를 설정했습니다. 예를 들어, 메일을 재 포맷하기위한 쉘 스크립트는 예를 들어 $LIB/mailfmt플랫폼 별 실행 바이너리 인 호출 할 수 있습니다 .

당신이 절단 된 모서리 원하는 경우 , uname -m그리고 일반은 uname당신이 많은 플랫폼에서 알고 싶은 당신에게 말할 것이다. 필요할 때 다른 것을 추가하십시오. (그리고 case중첩되지 않은를 사용하십시오 if!)


2
uname Command 에 따르면 매개 변수가없는 uname은 "-s"매개 변수를 사용하는 것과 같습니다. "-s 시스템 이름을 표시합니다.이 플래그는 기본적으로 설정되어 있습니다." 명백하게하기 위해 "uname"대신 "uname -s"를 사용할 수 있습니다. (정교 약간의 '쉘 출력 도움'에 대한 답변 )
— 피터 모텐슨

OS 및 프로세서 아키텍처를 안정적으로 감지하기 위해이 100 스크립트를 사용하여 github git 또는 pastebin에 대한 링크가 있습니까?
— 앤드류 드 안드라데

4
@AndrewDeAndrade이 코드를 공개하는 것이 부끄럽습니다. pastebin.com/J66Lj6wf
— Norman Ramsey

그래서 uname -s어때요?
— Alexander Mills

35

이 완전한 bash 코드를 사용하는 것이 좋습니다

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

더 많은 예제 예제는 다음과 같습니다. https://github.com/coto/server-easy-install/blob/master/lib/core.sh


1
소문자 함수를 생략하고 답을 업데이트했습니다.
— Robin Clowers

1
일단 그것이 리눅스라는 것을 안다면, 당신이 주변을 찌르고 있다면 (발견을 자동화하지 않으려는 것) 가장 쉬운 방법은 그냥 ls /etc"블라 릴리즈"를 찾는 것 같습니다. 등
— Chris Moschini

1
OS 변수에 대한 일부 참조가 "{$ OS}"로 작성 되었기 때문에 편집했습니다. 올바른 방법 인 "$ {OS}"로 변경했습니다.
— bazz

스크립트의 맨 끝에 "echo $ {OS}"를 추가 하시겠습니까?
— 올렉 코코 린

10

bash에서 문서화 된대로 $OSTYPE및을 사용하십시오 $HOSTTYPE. 이것이 제가하는 것입니다. 이것으로 충분하지 않고 짝수 uname또는 uname -a다른 적절한 옵션으로 충분한 정보를 얻지 못하면 GNU 프로젝트 의 config.guess 스크립트 가 항상 이 목적을 위해 만들어졌습니다.


10

이 답변 중 일부를 피하는 것이 좋습니다. 다른 형태의 문자열 비교를 선택할 수 있다는 것을 잊지 마십시오. 대부분의 변형 또는 제공된 추악한 코드를 정리할 수 있습니다.

그러한 해결책 중 하나는 다음과 같은 간단한 점검입니다.

if [[ "$OSTYPE" =~ ^darwin ]]; then

버전 접미사에도 불구하고 모든 버전의 Darwin과 일치하는 이점이 있습니다. 이것은 또한 Linux예상 되는 모든 변형에 적용 됩니다.

당신은 내 dotfiles 내에서 몇 가지 추가 예제를 볼 수 있습니다 여기에


9

"uname"을 사용해보십시오. 예를 들어, Linux의 경우 : "uname -a"

매뉴얼 페이지에 따르면 uname은 SVr4 및 POSIX를 준수하므로 Mac OS X 및 Cygwin 에서도 사용할 수 있지만 확인할 수는 없습니다.

BTW : $ OSTYPE도 linux-gnu여기로 설정됩니다 :)


매개 변수없이 uname은 Mac OS X (leopard)에서 'Darwin'을 인쇄합니다. -a를 사용하면 많은 추가 정보 (커널 버전, 아키텍처 및 해독 할 수없는 다른 것)를 인쇄합니다. cygwin에서 테스트 할 수 없습니다
— David Rodríguez-dribeas

8

나는이 설탕을 내 .bashrc:

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

그래서 나는 다음과 같은 것들을 할 수 있습니다 :

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"

BTW,이 9 줄은 대부분의 모든 Bash에서 작동합니다. 쉘 아웃이 없으며 거의 ​​모든 스타일의 개인 .bashrc (큰 중첩 if / case 트리 또는 많은 임의 별칭)와 함께 작동합니다. IMO는 위의 모든 답변에서 바지를 이깁니다.
— kfix

지금까지 Cygwin 및 기타 BSD (기본적으로 인기있는 * NIX 편집)를 포함하여 완성하기에 가장 가까운
— HidekiAI

오늘 관련이있는 유저 랜드에 적합하고 Bash를 실행하십시오. AIX / HP-UX / IRIX / OpenVMS 사용자는 차임 할 수 있습니다. Linux 용 새 Windows 서브 시스템은 amd64 Ubuntu 설치를 실행하므로 if_nix gnu&에 대해 true를 리턴해야합니다 if_os linux.
— kfix

1
@kfix 예, 맞습니다. win 10 bash 서브 시스템은에 대한 "linux-gnu"를 출력합니다 echo $OSTYPE. Win 10 bash 하위 시스템을 구체적으로 감지하기 위해 내가 찾은 유일한 솔루션은/proc/sys/kernel/osrelease
— Jpnh


7

내가 쓴 개인 배쉬 라이브러리와 스크립트 프레임 워크를 사용하는 GNU의 shtool을 오히려 정확한 플랫폼 검색을 할 수 있습니다.

GNU shtool은 다른 유용한 것들 중에서 'shtool platform'명령을 포함하는 이식성이 뛰어난 스크립트 세트입니다. 출력은 다음과 같습니다.

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

몇 가지 다른 머신에서 :

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

당신이 볼 수 있듯이 이것은 꽤 만족스러운 결과를 생성합니다. GNU shtool은 약간 느리므로 실제로 스크립트를 호출하는 시스템의 파일에 플랫폼 식별을 저장하고 업데이트합니다. 그것은 내 프레임 워크이므로 나에게 효과적이지만 마일리지는 다를 수 있습니다.

이제 스크립트로 shtool을 패키징하는 방법을 찾아야하지만 어려운 것은 아닙니다. 또한 항상 uname 출력으로 넘어갈 수 있습니다.

편집하다:

Teddy가 config.guess(어떻게 든) 게시물을 놓쳤습니다 . 이들은 매우 유사한 스크립트이지만 동일하지는 않습니다. 나는 개인적으로 다른 용도로 shtool을 사용하며 나에게 아주 잘 작동했습니다.


7

다음을 사용할 수 있습니다.

OS=$(uname -s)

스크립트에서 OS 변수를 사용할 수 있습니다.


당신 uname -s은 어떻게 다른지 설명 할 수 uname있습니까?
— Alexander Mills

@AlexanderMills -s, --kernel-name 커널 이름 인쇄
— Chetan kapoor

6

아래 는 / etc / lsb-release 및 / etc / os-release (사용중인 Linux 버전 에 따라 다름)를 사용 하는 데비안 및 RedHat 기반 Linux OS 를 감지 하고 이를 기반으로 간단한 조치를 취하는 방법입니다.

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

출력 예를 위한 우분투 리눅스 :

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            

5

모든 배포판에서 사용하기에 안전해야합니다.

$ cat /etc/*release

이것은 이와 같은 것을 생성합니다.

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

원하는대로 변수 추출 / 할당

참고 : 일부 설정에서. 또한 무시할 수있는 오류가 발생할 수 있습니다.

     cat: /etc/upstream-release: Is a directory

참고 : CentOS는에,이 있습니다[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
— cfstras

예, 내가 게시 한 출력은 내 노트북 ​​중 하나의 예입니다. 정적 콘텐츠가 아닌 모든 곳에서 볼 수 있습니다.
— RJ

그냥 아무도 결과 : 같은 형태로 항상 생각하지 않을 것이다 그래서 추가
— cfstras

1
+1 스크립트 시작 부분에 set -e를 사용하고 있습니다 (따라서이 솔루션은 doxer.org/linux-shell-centos-debian-ostype 작동하지 않습니다 ). 그리고 다른 솔루션은 특별히 CentOS가 아닙니다. 그러나 나는이 답변이 unix.stackexchange.com/a/92212
— gihanchanuka

4
Mac에서는 작동하지 않습니다 :cat: /etc/*release: No such file or directory
— eridal

3

이 시도:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"

macOS에서cat: /etc/*-release: No such file or directory
— csexton

@csexton 정말, 내가 같은 받고 있어요 : zsh: no matches found: /etc/*release-이 리눅스 시스템에만 작동합니다, 나는 가정 ...
— 알렉산더 Nekrasov 보낸

이 답변은 Linux에서만 작동합니다. 그러나 다른 답변은 다른 시스템과 반대로 Linux를 감지 할 수 있습니다. 이 기본적인 발견은 FreeBSD와 Darwin을 구별하는 것만큼이나 특정 Linux 배포판을 발견하는 데 전혀 도움이되지 않습니다.
— Thomas Urban

3

다음 if 절을 사용하고 필요에 따라 확장 할 수 있습니다.

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi

2

몇 가지 Linux 배포판에서 위의 메시지를 시도한 결과 다음과 같은 것이 가장 효과적입니다. Windows의 Bash에서도 작동하는 짧고 간결한 정확한 단어 답변입니다.

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu

2
이 코드 스 니펫은 환영하고 도움이 될 수 있지만 이것이 문제를 해결하는 방법 과 이유에 대한 설명 을 포함하면 크게 향상 될 것 입니다. 지금 질문하는 사람뿐만 아니라 앞으로 독자들에게 질문에 대답하고 있음을 기억하십시오! 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
— Toby Speight

1
대부분의 Linux 시스템에서는 훌륭하고 간결 해 보이지만 불행히도 macOS에서 오류가 발생합니다. 아마도 이것은 더 "배쉬에서 리눅스 배포판의 맛을 감지 기능
— csexton

1
@ csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )이것은 오류를 발생시키지 않고 작동합니다.
— Kuzeko

실제로, 여기에 올바른 방법이 있습니다OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
— Kuzeko

@Kuzeko 불행히도 macOS에서 여전히이 오류를 발생시킵니다.
— csexton

1

모든 플랫폼이 액세스 할 수있는 파일 공유에 .bashrc 및 .bash_alias를 유지하는 경향이 있습니다. 이것이 .bash_alias에서 문제를 극복하는 방법입니다.

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

그리고 예를 들어 .bash_alias_Linux가 있습니다.

alias ls='ls --color=auto'

이렇게하면 플랫폼 특정 코드와 이식 가능한 코드를 별도로 유지하므로 .bashrc에 대해 동일한 작업을 수행 할 수 있습니다


1

knownLinux 배포판이 Debian 또는 Ubunu인지 확인하기 위해 많은 파일을 확인한 다음 기본값을 $OSTYPE변수로 지정합니다.

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"

-1

다음을 수행하면 우분투 검사를 올바르게 수행하는 데 도움이되었습니다.

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

4
apt-get을 사용하지 않는 다른 Linux 시스템은 어떻습니까?
— Wilf

우분투는 운영 체제 클래스가 아닌 배포판입니다.
— 지터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.