Bash betiğinden işletim sistemi nasıl algılanır?


525

Kullandığım tüm bilgisayarlar arasında kullanabilmem için dosyalarımı .bashrcve .bash_logindosyaları sürüm kontrolünde tutmak istiyorum . Sorun, bazı işletim sistemine özgü takma adlar var, bu yüzden komut dosyasının Mac OS X, Linux veya Cygwin üzerinde çalışıp çalışmadığını belirlemek için bir yol arıyordum .

Bash betiğindeki işletim sistemini algılamanın doğru yolu nedir ?


1
Hiç yapılandırmalarınızı paylaşmayı düşündünüz mü? Ben aynı tür bir kurulum almak için bakıyordum :)
sorin

@sorin Bunun eski bir yorum olduğunu biliyorum, ancak hala merak ediyorsanız , tüm makineleriniz için takılabilir bash ortamlarını yapılandırmanıza izin veren ProfileGem oluşturuyorum.
dimo414

1
@ dimo414 profilegem buraya taşındı görünüyor bitbucket.org/dimo414/profilegem . Genel olarak bash yapılandırmalarını paylaşarak, şu dotfiles projelerinden bazılarını deneyin: github.com/…
mahemoff

1
@mahemoff güncellenen bağlantı için teşekkürler, üzgünüm yorumumu düzenleyemiyorum. ProfileGem ile deneme yapıyorsanız geri bildirim veya hataları memnuniyetle karşılarım!
dimo414

Alas BitBucket Mercurial desteğini kapatıyor, bu yüzden bağlantımı tekrar güncellemeliyim :( github.com/dimo414/ProfileGem yeni ev.
dimo414

Yanıtlar:


521

Bence aşağıdakiler işe yaramalı. win32Yine de emin değilim .

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'ta msysGit Bash / msysGit ve cygwinCygwin için
friederbluemle

1
Windows için nasıl algılanacağını da içeren bu yanıt iyidir. Ben de msys
Mingw32

2
İlginç .. Mac OSX hala 'darwin' verecekti.
jonathanbell

6
Beni harekete geçiren bir şey, yorumu bir komutla değiştirdiğinizde - ile bitirdiğinizden emin olun ;.
Vadim Peretokin

1
Gibi bir komut eklediğimde source somefile ; , alıyorum syntax error near unexpected token elif.
oarfish

292

Benim .bashrc için, aşağıdaki kodu kullanın:

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

Sonra şöyle şeyler yaparım:

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

Çirkin, ama işe yarıyor. İsterseniz, caseyerine kullanabilirsiniz if.


6
Neden sadece unamestr kullanmak yerine platformu unamestr'den ayarlıyorsunuz?
csexton

80
Backticks kullanmayın, daha yeni daha net sözdizimini kullanın: "unamestr = $ (uname)".
açma

15
Hızlı bir bakışla, geri tepmeler bir ipe benzeyebilir.
Harrison Powers

29
@ david-winiecki Çünkü komutları iç içe yerleştirmeniz gerekiyorsa, örneğin $ (command-1 $ (command-2))
Michael Barton

4
Yapmak daha iyi olmaz mıydı: platform="$(uname | tr '[:upper:]' '[:lower:]')"ve sonra kesinlikle bir davaya bakalım mı? Çok özel bir çıktıya bağımlılığı kodlamak garip görünüyor.
Brandon Buck

274

Bash manpage, OSTYPE değişkeninin işletim sisteminin adını sakladığını söylüyor:

OSTYPEOtomatik olarak bash'ın yürütüldüğü işletim sistemini tanımlayan bir dizeye ayarlanır. Varsayılan sisteme bağlıdır.

Burada ayarlanmış linux-gnu.


5
Ayrıca, $ OSTYPE, mac'umda (Leopard) 'darwin9.0' ve Cygwin yönetimindeki 'cygwin'.
dF.

5
$ OSTYPE, SnowLeopard'da darwin10.0'dır. WTF sürümü eklenmiş mi? Basit bir vaka ifadesinin işe yaramayacağı anlamına gelir.
mxcl

16
Onu kaldırmak o kadar büyük değil:os=${OSTYPE//[0-9.]/}
ABach

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

36
@tripleee veya "if" sözdizimi ile daha rahat insanlar için:if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7

158

$OSTYPE

Önceden tanımlanmış $OSTYPEdeğişkeni kullanabilirsiniz :

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

Ancak eski mermiler ( Bourne kabuğu gibi ) tarafından tanınmaz .


uname

Başka bir yöntem de unamekomuta dayalı olarak platformu tespit etmektir .

Aşağıdaki komut dosyasına bakın (.bashrc dosyasına eklenmeye hazır):

# 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

Burada bazı pratik örnekler bulabilirsiniz.bashrc .


İşte Travis CI'de kullanılan benzer sürüm :

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 kontrolünde bir windows makinesini gösteren cygwin için bir şube eksik. Uname denetimi de düzgün çalışmaz, cygwin uname "CYGWIN_NT-10.0" döndürür ve MinGW uname "MINGW64_NT-10.0" döndürür.
Matt Pennington

1
diğer ad ls = '/ bin / ls -G' aslında güvenli bir seçenektir, işletim sistemi tabanlı ibneler bağlamında bkz. superuser.com/a/1299969/84662
Andrei Neculau

Ben kullanmanızı öneririz uname, Oracle glossed kongre ve onların ile bir ücretsiz sürüm dizesi koydu OSTYPE ==> solaris2.11. unamebiraz daha temiz ve daha az iş.
will

37

İşletim sistemi ve CPU türünü algılamak taşınabilir olarak yapmak o kadar kolay değildir . SahibimshÇok çeşitli Unix platformlarında çalışan yaklaşık 100 satırlık senaryom : 1988'den beri kullandığım herhangi bir sistem.

Anahtar unsurlar

  • uname -polan işlemci türü ama genellikle unknownmodern bir Unix platformlarında.

  • uname -m bazı Unix sistemlerinde "makine donanım adı" verecektir.

  • /bin/arch, varsa, genellikle işlemci türünü verir.

  • uname hiçbir argüman olmadan işletim sistemini adlandırır.

Sonunda platformlar arasındaki farkları ve bunları ne kadar iyi yapmak istediğinizi düşünmeniz gerekecek. Örneğin, sadece şeyler basit tutmak için, ben tedavi i386yoluyla i686herhangi bir " Pentium*" ve herhangi bir "AMD*Athlon* " Tüm olarak x86.

My ~/.profile, başlangıçta bir değişkenin CPU ve işletim sistemi birleşimini gösteren bir dizeye ayarlayan bir komut dosyası çalıştırır. Ben platforma özel var bin, man, libve includekurmak için dizinleri buna dayanarak. Sonra bir ortam değişkenleri yükü belirledim. Örneğin, postayı yeniden biçimlendirmek için bir kabuk komut dosyası, ör.$LIB/mailfmt platforma özgü yürütülebilir bir ikili dosya olabilir.

Eğer kesme köşelerinde istiyorsanız , uname -mKayar unamebirçok platformda bilmek istediklerini söyleyecektir. İhtiyacınız olduğunda başka şeyler ekleyin. (Ve kullanın case, iç içe değil if!)


2
Uname Command'a göre , parametresiz uname "-s" parametresini kullanmaya eşdeğerdir: "-s Sistem adını görüntüler. Bu bayrak varsayılan olarak açıktır." Açık olmak gerekirse, "uname" yerine "uname -s" kullanılabilir. ( 'Kabuk çıktı yardımı' cevabında biraz detaylandı )
Peter Mortensen

İşletim sistemi ve işlemci mimarisini güvenilir bir şekilde tespit etmek için bu 100 komut dosyasıyla bir github git veya pastebin bağlantınız var mı?
Andrew De Andrade

4
@AndrewDeAndrade Bu kodu halka açıklamaktan utanıyorum. pastebin.com/J66Lj6wf
Norman Ramsey

peki nasıl uname -s?
Alexander Mills

35

Bu tam bash kodunu kullanmanızı tavsiye ederim

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

daha fazla örnek burada: https://github.com/coto/server-easy-install/blob/master/lib/core.sh


1
Küçük harf işlevini dışarıda bıraktınız, cevabınızı sizin için güncelledim.
Robin Clowers

1
Linux olduğunu öğrendikten sonra, sadece etrafta dolaşıyorsanız (bulmayı otomatikleştirmeye çalışmıyorsanız), en kolay hareket sadece ls /etc "falan serbest bırakma" aramak ve aramaktır - her ne olursa olsun, Linux işletim sistemi - CentOS, Ubuntu vs
Chris Moschini

1
Düzenledim çünkü işletim sistemi değişkenine yapılan bazı referanslar "{$ OS}" olarak yazılmıştır.
olanı

senaryonun sonuna "echo $ {OS}" eklemeyi düşünür müsün?
Oleg Kokorin

10

Bash'da $OSTYPEve $HOSTTYPEbelgelendiği gibi kullanın ; bu benim işim. Bu yeterli değilse ve hatta unameveya uname -a(veya diğer uygun seçenekler) yeterli bilgi vermezse , GNU projesinden her zaman tam olarak bu amaçla yapılmış config.guess betiği vardır.


10

Bu cevaplardan bazılarından kaçınmayı öneririm. Varyasyonların çoğunu veya sunulan çirkin kodu temizleyecek diğer dize karşılaştırma biçimlerini seçebileceğinizi unutmayın.

Böyle bir çözüm, aşağıdakiler gibi basit bir kontrol olacaktır:

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

Hangi sürüm eki rağmen, Darwin'in herhangi bir sürümü eşleştirme ek bir yararı vardır. Bu aynı zamanda herhangi Linuxbirinin beklediği değişiklikler için de geçerlidir .

Dotfiles dosyalarımda bazı ek örnekleri burada görebilirsiniz


9

"Uname" kullanmayı deneyin. Örneğin, Linux'ta: "uname -a".

Manuel sayfasına göre, SVR4 ve POSIX'e'uname uygundur, bu nedenle Mac OS X ve geçerli olmalıdır Cygwin de ama bunu teyit edemez.

BTW: $ OSTYPE burada da ayarlandı linux-gnu:)


Parametreler olmadan uname, Mac OS X'te (leopar) 'Darwin'i yazdırır. -A ile çok fazla fazla bilgi yazdırır (çekirdek sürümü, mimari ve deşifre edemediğim başka bir şey). Cygwin üzerinde test yapamıyorum
David Rodríguez - dribeas

8

Bu şekerlerimi şöyle yazdım .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" ]];
}

Yani şöyle şeyler yapabilirim:

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, bu 9 satır çoğu şey üzerinde çalışan herhangi bir Bash üzerinde çalışır. Hiçbir shellouts ve hemen hemen her türlü kişisel .bashrc ile çalışır (büyük iç içe eğer / case ağaçlar veya çok sayıda rastgele takma ad). IMO, üstündeki her cevaptan pantolonunu atıyor.
kfix

Şimdiye kadar, Cygwin ve diğer BSD (temel olarak popüler *
NIX'in

Bugün alakalı olan ve Bash kullanan kullanıcı alanları için tamamlayın. AIX / HP-UX / IRIX / OpenVMS kullanıcıların uymak olabilir. Linux için yeni Windows Subsystem her ikisi için geçerlidir dönmelidir yüzden Ubuntu amd64'tür stok yüklemek çalıştırır if_nix gnu& if_os linux.
kfix

1
@kfix evet doğru, kazanmak 10 bash alt sistemi için "linux-gnu" çıktılar echo $OSTYPE. Özellikle kazanmak 10 bash alt sistemi tespit etmek için bulduğum tek çözüm "Microsoft" için kontrol etmek oldu/proc/sys/kernel/osrelease
Jpnh


7

Yazdığım kişisel Bash kütüphane ve komut dosyası çerçevesini kullanan GNU shtool oldukça hassas platform tespitinin yapmak.

GNU shtool, diğer faydalı şeylerin yanı sıra, 'shtool platformu' komutunu içeren çok taşınabilir bir komut dizisidir. İşte çıktı:

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

birkaç farklı makinede:

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)

Gördüğünüz gibi bu oldukça tatmin edici sonuçlar verir. GNU shtool biraz yavaş, bu yüzden aslında platform tanımlamasını komut dosyalarının çağırdığı sistemdeki bir dosyada saklayıp güncelliyorum. Bu benim çerçevem, bu yüzden benim için çalışıyor, ancak kilometreniz değişebilir.

Şimdi, shtool'u komut dosyalarınızla paketlemenin bir yolunu bulmanız gerekecek, ancak bu zor bir egzersiz değil. Ayrıca her zaman uname çıktısına geri dönebilirsiniz.

DÜZENLE:

Teddy'nin gönderisini config.guess(her nasılsa) kaçırdım . Bunlar çok benzer komut dosyalarıdır, ancak aynı değildir. Şahsen shtool'u diğer kullanımlar için de kullanıyorum ve benim için oldukça iyi çalışıyor.


7

Aşağıdakileri kullanabilirsiniz:

OS=$(uname -s)

betiğinizde OS değişkenini kullanabilirsiniz.


nasıl uname -sfarklı olduğunu açıklayabilir misiniz uname?
Alexander Mills

@AlexanderMills -s, --kernel-name çekirdek adını yazdır
Chetan kapoor

6

Aşağıda , / etc / lsb-release ve / etc / os-release (kullandığınız Linux lezzetine bağlı olarak) kullanarak Debian ve RedHat tabanlı Linux işletim sistemini tespit etmek ve buna dayalı basit bir işlem yapmak için bir yaklaşım vardır.

#!/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

Ubuntu Linux için çıktı örneği :

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

Bu, tüm dağıtımlarda kullanmak için güvenli olmalıdır.

$ cat /etc/*release

Bu böyle bir şey üretir.

     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/"

Değişkenleri istediğiniz gibi ayıklayın / atayın

Not: Bazı kurulumlarda. Bu, göz ardı edebileceğiniz bazı hatalar da verebilir.

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

Not: [user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
CentOS'ta

Evet, gönderdiğim çıktı, her yerde gördüğünüz statik içerikten değil, dizüstü bilgisayarlarımdan birinden bir örnekti.
RJ

Sadece kimsenin sonucun her zaman aynı formda olduğunu düşünmeyeceğini ekledi :)
cfstras

1
+1 Ben betiğin başında set -e kullanıyorum (Bu nedenle bu çözüm doxer.org/linux-shell-centos-debian-ostype ) çalışmıyor . Ve diğer çözümler özellikle CentOS değil. Ama bu cevabı kanıtlayan bu referansı buldum unix.stackexchange.com/a/92212
gihanchanuka

4
Mac için çalışmıyor:cat: /etc/*release: No such file or directory
eridal

3

bunu dene:

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

cat: /etc/*-release: No such file or directory
MacOS'ta

@csexton gerçekten, aynı alıyorum: zsh: no matches found: /etc/*release- Bu sadece linux sistemleri için çalışacak, sanırım ...
Alexander Nekrasov

Bu cevap kesinlikle Linux için geçerlidir. Ancak diğer yanıtlar Linux'u yalnızca diğer sistemlere karşı tespit edebilir. Bu temel keşif, belirli Linux dağıtımını keşfetmeye hiç yardımcı olmuyor, FreeBSD ve Darwin'i ayırt etmek kadar önemlidir.
Thomas Urban

3

Aşağıdaki yan tümceyi kullanabilir ve gerektiği gibi genişletebilirsiniz:

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

Birkaç Linux dağıtımında yukarıdaki mesajları denedim ve aşağıdakileri benim için en uygun şekilde buldum. Windows'ta Bash için de çalışan kısa ve özlü bir kelime cevabı.

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

2
Bu kod parçacığı açığız ve bazı yardım sağlamak görülebilir fakat bunun olacağını bunun bir açıklama dahil eğer büyük ölçüde geliştirilmiş bir nasıl ve niçin bu çözer sorunu. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın! Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
Toby Speight

1
Çoğu linux sistemi için hoş ve kısa görünüyor, ancak maalesef bu macOS'ta bir hataya neden olacaktır. Belki bu daha fazla "Bash linux dağıtım lezzet tespit
csexton

1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )bu hata atmadan çalışacaktır.
Kuzeko

Aslında, işte doğru bir yolOS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Kuzeko

@Kuzeko Maalesef bunu macOS'ta çalıştırırken hatalar alıyorum.
csexton

1

.Bashrc ve .bash_alias'ımı tüm platformların erişebileceği bir dosya paylaşımında tutma eğilimindeyim. .Bash_alias'ımdaki sorunu şu şekilde fethediyorum:

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

Ve örneğin bir .bash_alias_Linux ile var:

alias ls='ls --color=auto'

Bu şekilde platforma özgü ve taşınabilir kodu ayrı tutarım .bashrc için de aynısını yapabilirsiniz


1

Bu known, linux dağıtımının Debian mı yoksa Ubunu mu olduğunu belirlemek için bir grup dosyayı kontrol eder , ardından varsayılan olarak $OSTYPEdeğişkendir.

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

Aşağıdakileri yapmak ubuntu için denetimin doğru şekilde yapılmasına yardımcı oldu:

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

4
Apt-get kullanmayan diğer Linux sistemleri ne olacak?
Wilf

Ubuntu bir işletim sistemi sınıfı değil, bir dağıtımdır.
jitter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.