Como detectar o sistema operacional de um script Bash?

525

Gostaria de manter meus arquivos .bashrce .bash_loginno controle de versão para poder usá-los entre todos os computadores que uso. O problema é que eu tenho alguns aliases específicos do SO, então estava procurando uma maneira de determinar se o script está sendo executado no Mac OS X, Linux ou Cygwin .

Qual é a maneira correta de detectar o sistema operacional em um script Bash ?

Csexton
fonte
1
Você já pensou em compartilhar suas configurações? Eu estava olhando para obter o mesmo tipo de configuração :)
Sorin
@sorin Eu sei que é um comentário antigo, mas se você ainda está curioso, estou criando o ProfileGem, que permite configurar ambientes bash conectáveis ​​para todas as suas máquinas.
dimo414
1
@ dimo414 profilegem parece ter sido movido para cá bitbucket.org/dimo414/profilegem . Tanto quanto compartilhando configurações festança em geral, experimentar alguns destes projectos dotfiles: github.com/...
mahemoff
1
@mahemoff obrigado pelo link atualizado, desculpe, não posso editar meu comentário. Gostaria de receber feedback ou bugs se você estiver experimentando o ProfileGem!
precisa saber é o seguinte
Infelizmente, o BitBucket está recusando o suporte do Mercurial, então eu tenho que atualizar meu link novamente :( github.com/dimo414/ProfileGem é a nova casa.
dimo414

Respostas:

521

Eu acho que o seguinte deve funcionar. Eu não tenho certeza sobre isso 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
Timmmm
fonte
7
No Windows, você terá msyspara Git Bash / msysGit, e cygwinpara Cygwin
friederbluemle
1
Esta resposta, incluindo como detectar no Windows, é boa. Eu também estou usando Mingw32 e ele aparece comomsys
d48
2
Interessante .. Mac OSX ainda daria 'darwin'.
22615 jonathanbell
6
Algo que me tropeçou quando você substituiu o comentário por um comando - certifique-se de terminar com ;.
Vadim Peretokin
1
Quando adiciono um comando como source somefile ; , recebo syntax error near unexpected token elif.
oarfish
292

Para o meu .bashrc, eu uso o seguinte código:

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

Então eu faço coisas como:

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

É feio, mas funciona. Você pode usar em casevez de, ifse preferir.

Nicolas Martyanoff
fonte
6
Por que você define a plataforma da unamestr, em vez de apenas usar a unamestr?
C26 #
80
Não use backticks, use a sintaxe mais recente e mais clara: "unamestr = $ (uname)".
descontraia
15
De uma rápida olhada, os backticks podem parecer uma corda.
Harrison Powers
29
@ David-Winiecki Porque se você precisa ninho comandos por exemplo $ (-1 comando $ (command-2))
Michael Barton
4
Não seria muito melhor fazer: platform="$(uname | tr '[:upper:]' '[:lower:]')"e então definitivamente lidar com um caso? Parece estranho codificar uma dependência de saída muito específica.
Brandon Buck
274

A página de manual do bash diz que a variável OSTYPE armazena o nome do sistema operacional:

OSTYPEConfigure automaticamente como uma sequência que descreva o sistema operacional no qual o bash está sendo executado. O padrão é dependente do sistema.

Está definido linux-gnuaqui.

Johannes Schaub - litb
fonte
5
Além disso, $ OSTYPE é 'darwin9.0' no meu mac (Leopard) e 'cygwin' no Cygwin.
dF.
5
$ OSTYPE é darwin10.0 no SnowLeopard. WTF com a versão anexada? Significa que uma simples declaração de caso não funcionará.
Mxcl 3/09/09
16
Não é que de um grande negócio para removê-lo:os=${OSTYPE//[0-9.]/}
Abach
86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
Tripleee
36
@tripleee ou para as pessoas que estão mais confortáveis com "se" sintaxe:if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7
159

$OSTYPE

Você pode simplesmente usar $OSTYPEvariáveis predefinidas , por exemplo:

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

No entanto, não é reconhecido pelas conchas mais antigas (como a casca de Bourne ).


uname

Outro método é detectar a plataforma com base no unamecomando.

Consulte o seguinte script (pronto para incluir no .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

Você pode encontrar alguns exemplos práticos no meu.bashrc .


Aqui está a versão semelhante usada no 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
kenorb
fonte
1
Na verificação $ OSTYPE está faltando uma ramificação para o cygwin, o que indicaria uma máquina Windows. A verificação uname também não funcionaria corretamente, no cygwin uname retorna "CYGWIN_NT-10.0" e no MinGW uname retorna "MINGW64_NT-10.0".
Matt Pennington
1
alias ls = '/ bin / ls -G' é realmente a opção segura, no contexto de fags baseados em SO, consulte superuser.com/a/1299969/84662
Andrei Neculau
Eu sugiro usar uname, a Oracle encobriu a convenção e colocou uma string de versão gratuita com a deles OSTYPE ==> solaris2.11. unameé um pouco mais limpo e menos trabalhoso a fazer.
será
37

Detectar o sistema operacional e o tipo de CPU não é tão fácil de executar de maneira portável . Eu tenho um shscript de cerca de 100 linhas que funciona em uma grande variedade de plataformas Unix: qualquer sistema que eu usei desde 1988.

Os principais elementos são

  • uname -pé do tipo processador, mas geralmente está unknownem plataformas modernas do Unix.

  • uname -m dará o "nome do hardware da máquina" em alguns sistemas Unix.

  • /bin/arch, se existir, geralmente fornecerá o tipo de processador.

  • uname sem argumentos nomeará o sistema operacional.

Eventualmente, você terá que pensar nas distinções entre plataformas e em quão bem você deseja torná-las. Por exemplo, apenas para manter as coisas simples, eu trato i386através i686, qualquer " Pentium*" e qualquer " AMD*Athlon*" todos como x86.

Minhas ~/.profile executa um script na inicialização, que define uma variável para uma string, indicando a combinação de CPU e sistema operacional. Tenho específico da plataforma bin, man, lib, e includediretórios que são criadas com base nisso. Depois, defino um monte de variáveis ​​de ambiente. Por exemplo, um script de shell para reformatar o correio pode chamar, por exemplo, $LIB/mailfmtum binário executável específico da plataforma.

Se você deseja cortar custos , o uname -mplain unamelhe dirá o que você quer saber em muitas plataformas. Adicione outras coisas quando precisar. (E use case, não aninhado if!)

Norman Ramsey
fonte
2
De acordo com o comando uname , uname sem um parâmetro é equivalente a usar o parâmetro "-s": "-s Exibe o nome do sistema. Esse sinalizador está ativado por padrão.". Para ser explícito, pode-se usar "uname -s" em vez de "uname". (Elaboração pouco em uma resposta para 'Shell ajuda de saída' )
Peter Mortensen
Você tem um link para um gitub git ou pastebin com este script 100 para detectar de maneira confiável a arquitetura do SO e do processador?
Andrew De Andrade
4
@AndrewDeAndrade Tenho vergonha de expor esse código ao público. pastebin.com/J66Lj6wf
Norman Ramsey
então que tal uname -s?
Alexander Mills
35

Eu recomendo usar este código completo do 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

mais exemplos exemplos aqui: https://github.com/coto/server-easy-install/blob/master/lib/core.sh

coto
fonte
1
Você deixou de lado a função minúscula, eu atualizei sua resposta para você.
Robin Clowers
1
Uma vez que você conhece o Linux, se você está apenas bisbilhotando (sem tentar automatizar a descoberta), parece que a ação mais fácil é apenas ls /etcprocurar e "blá-release" - qualquer que seja o blá, esse é o sistema operacional Linux - CentOS, Ubuntu , etc
Chris Moschini
1
Eu editei porque algumas das referências a variável OS foram escritos como "{$ OS}" Eu mudei-los para "$ {OS}", que é o caminho certo, eu testei
bazz
você consideraria adicionar "echo $ {OS}" no final do script?
Oleg Kokorin
10

No bash, use $OSTYPEe $HOSTTYPE, conforme documentado; isto é o que eu faço. Se isso não for suficiente, e se even unameou uname -a(ou outras opções apropriadas) não fornecerem informações suficientes, sempre haverá o script config.guess do projeto GNU, feito exatamente para esse fim.

Urso de pelúcia
fonte
10

Eu sugeriria evitar algumas dessas respostas. Não esqueça que você pode escolher outras formas de comparação de strings, o que esclareceria a maioria das variações ou o código feio oferecido.

Uma dessas soluções seria uma verificação simples, como:

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

O qual tem o benefício adicional de corresponder a qualquer versão do Darwin, apesar do sufixo da versão. Isso também funciona para qualquer variação deLinux se possa esperar.

Você pode ver alguns exemplos adicionais nos meus dotfiles aqui

Akiva
fonte
9

Tente usar "uname". Por exemplo, no Linux: "uname -a".

De acordo com a página do manual, uname está em conformidade com SVr4 e POSIX, portanto deve estar disponível no Mac OS X e Cygwin , mas não posso confirmar isso.

BTW: $ OSTYPE também está definido como linux-gnuaqui :)

João da Silva
fonte
Sem parâmetros, uname imprime 'Darwin' no Mac OS X (leopard). Com -a, ele imprime muita informação extra (versão do kernel, arquitetura e outra coisa que não consigo decifrar). Eu não pode testar em cygwin
David Rodríguez - dribeas
8

Eu escrevi esses açúcares no meu .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" ]];
}

Para que eu possa fazer coisas como:

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"
kfix
fonte
BTW, essas 9 linhas funcionam em qualquer Bash em execução em quase tudo. Não há shellouts e funciona com quase qualquer estilo de .bashrc pessoal (grandes árvores aninhadas de if / case ou muitos aliases aleatórios). IMO, bate as calças fora cada resposta acima dela.
kfix
Até agora, mais próximo de completar para incluir Cygwin e outros BSD (basicamente compilação de populares * NIX)
HidekiAI
Completo para áreas de usuários relevantes hoje e execute o Bash. AIX / HP-UX / IRIX / OpenVMS usuários poderiam gritei. O novo Windows Subsistema para Linux executa um estoque amd64 Ubuntu instalar por isso deve retornar verdadeiro tanto para if_nix gnu& if_os linux.
kfix
1
@kfix sim, está certo, o subsistema win 10 bash gera "linux-gnu" para echo $OSTYPE. Para detectar vitória 10 do bash subsistema especificamente, a única solução que eu encontrei foi a de buscar por "Microsoft" em/proc/sys/kernel/osrelease
Jpnh
7
uname

ou

uname -a

se você quiser mais informações

Federico A. Ramponi
fonte
7

Eu escrevi uma biblioteca pessoal Bash e uma estrutura de script que usa o GNU shtool para fazer uma detecção de plataforma bastante precisa.

GNU shtool é um conjunto muito portátil de scripts que contém, entre outras coisas úteis, o comando 'shtool platform'. Aqui está a saída de:

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

em algumas máquinas diferentes:

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)

Isso produz resultados bastante satisfatórios, como você pode ver. O GNU shtool é um pouco lento, então eu realmente armazeno e atualizo a identificação da plataforma em um arquivo no sistema que meus scripts chamam. É a minha estrutura, de modo que funciona para mim, mas sua milhagem pode variar.

Agora, você terá que encontrar uma maneira de empacotar o shtool com seus scripts, mas não é um exercício difícil. Você também pode sempre usar a saída uname.

EDITAR:

Perdi o post de Teddy sobre config.guess(de alguma forma). Esses scripts são muito semelhantes, mas não são os mesmos. Eu pessoalmente uso o shtool para outros usos também, e tem funcionado muito bem para mim.

armas
fonte
7

Você pode usar o seguinte:

OS=$(uname -s)

então você pode usar a variável do SO no seu script.

Chetan kapoor
fonte
você pode explicar como uname -sé diferente uname?
Alexander Mills
@AlexanderMills -s, --kernel-name imprime o nome do kernel
Chetan kapoor
6

Abaixo está uma abordagem para detectar o SO Linux baseado no Debian e RedHat usando o / etc / lsb-release e / etc / os-release (dependendo do sabor do Linux que você está usando) e executar uma ação simples com base nele.

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

Exemplo de saída para o Ubuntu Linux:

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] 
...            
Exequiel Barrirero
fonte
5

Deve ser seguro usá-lo em todas as distros.

$ cat /etc/*release

Isso produz algo parecido com isto.

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

Extraia / atribua às variáveis ​​como desejar

Nota: Em algumas configurações. Isso também pode fornecer alguns erros que você pode ignorar.

     cat: /etc/upstream-release: Is a directory
RJ
fonte
Nota: no CentOS, isso dá[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cfstras
Sim, a saída que publiquei foi um exemplo, de um dos meus laptops, não o conteúdo estático que você vê em todos os lugares.
RJ
Apenas acrescentou que para que ninguém pensaria que o resultado é sempre na mesma forma :)
cfstras
1
+1 Estou usando set -e no início do script (portanto, esta solução não está funcionando doxer.org/linux-shell-centos-debian-ostype ). E outras soluções não especificamente o CentOS. Mas eu achei esta referência que provou esta resposta unix.stackexchange.com/a/92212
gihanchanuka
4
não funciona no Mac:cat: /etc/*release: No such file or directory
eridal
3

tente isto:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"
Alexander Nekrasov
fonte
No macOS eu recebocat: /etc/*-release: No such file or directory
csexton
@csexton realmente, eu estou recebendo o mesmo: zsh: no matches found: /etc/*release- isso vai funcionar apenas para sistemas Linux, suponho ...
Alexander Nekrasov
Esta resposta funciona apenas para Linux, com certeza. Mas outras respostas são capazes de detectar o Linux em oposição a outros sistemas. Esta descoberta básica não ajuda em nada a descoberta de uma distribuição Linux específica, é tão essencial quanto distinguir entre o FreeBSD e o Darwin.
Thomas Urban
3

Você pode usar a seguinte cláusula if e expandi-la conforme necessário:

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

Tentei as mensagens acima em algumas distribuições Linux e achei o seguinte a funcionar melhor para mim. É uma resposta curta e concisa das palavras exatas que também funciona com o Bash no Windows.

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu
intellilogic
fonte
2
Embora esse trecho de código seja bem-vindo e possa fornecer alguma ajuda, ele seria bastante aprimorado se incluísse uma explicação de como e por que isso resolve o problema. Lembre-se de que você está respondendo à pergunta dos leitores no futuro, não apenas à pessoa que está perguntando agora! Por favor edite sua resposta para adicionar explicação, e dar uma indicação do que limitações e premissas se aplicam.
precisa
1
Parece bom e conciso para a maioria dos sistemas Linux, mas infelizmente isso resultará em um erro no macOS. Talvez este seja mais "detectar o sabor distribuição Linux a partir de Bash
csexton
1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )isso funcionará sem gerar erros.
Kuzeko #
Na verdade, aqui é uma maneira corretaOS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Kuzeko
@ Kuzeko Infelizmente, ainda recebo erros ao executar isso no macOS.
precisa saber é
1

Costumo manter meus arquivos .bashrc e .bash_alias em um compartilhamento de arquivo que todas as plataformas podem acessar. É assim que eu supero o problema em minhas .bash_alias:

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

E eu tenho, por exemplo, um .bash_alias_Linux com:

alias ls='ls --color=auto'

Dessa forma, mantenho o código específico da plataforma e o portátil separados, você pode fazer o mesmo com o .bashrc

ericcurtina
fonte
1

Isso verifica um monte de knownarquivos para identificar se a distribuição Linux é Debian ou Ubunu, e o padrão é a $OSTYPEvariável.

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"
Kuzeko
fonte
-1

Fazer o seguinte ajudou a executar a verificação corretamente no ubuntu:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi
sandman
fonte
4
E quanto a outros sistemas Linux que não usam o apt-get?
Wilf
O ubuntu é uma distribuição, não uma classe de sistema operacional.
jitter