Gostaria de manter meus arquivos .bashrc
e .bash_login
no 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 ?
bash
os-detection
Csexton
fonte
fonte
Respostas:
Eu acho que o seguinte deve funcionar. Eu não tenho certeza sobre isso
win32
.fonte
msys
para Git Bash / msysGit, ecygwin
para Cygwinmsys
;
.source somefile ;
, recebosyntax error near unexpected token elif
.Para o meu .bashrc, eu uso o seguinte código:
Então eu faço coisas como:
É feio, mas funciona. Você pode usar em
case
vez de,if
se preferir.fonte
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.A página de manual do bash diz que a variável OSTYPE armazena o nome do sistema operacional:
Está definido
linux-gnu
aqui.fonte
os=${OSTYPE//[0-9.]/}
case $OSTYPE in darwin*) echo I am a Mac ;; esac
if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
$OSTYPE
Você pode simplesmente usar
$OSTYPE
variáveis predefinidas , por exemplo:No entanto, não é reconhecido pelas conchas mais antigas (como a casca de Bourne ).
uname
Outro método é detectar a plataforma com base no
uname
comando.Consulte o seguinte script (pronto para incluir no .bashrc):
Você pode encontrar alguns exemplos práticos no meu
.bashrc
.Aqui está a versão semelhante usada no Travis CI :
fonte
uname
, a Oracle encobriu a convenção e colocou uma string de versão gratuita com a delesOSTYPE ==> solaris2.11
.uname
é um pouco mais limpo e menos trabalhoso a fazer.Detectar o sistema operacional e o tipo de CPU não é tão fácil de executar de maneira portável . Eu tenho um
sh
script 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áunknown
em 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
i386
atravési686
, qualquer "Pentium*
" e qualquer "AMD*Athlon*
" todos comox86
.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 plataformabin
,man
,lib
, einclude
diretó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/mailfmt
um binário executável específico da plataforma.Se você deseja cortar custos , o
uname -m
plainuname
lhe dirá o que você quer saber em muitas plataformas. Adicione outras coisas quando precisar. (E usecase
, não aninhadoif
!)fonte
uname -s
?Eu recomendo usar este código completo do bash
mais exemplos exemplos aqui: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
fonte
ls /etc
procurar e "blá-release" - qualquer que seja o blá, esse é o sistema operacional Linux - CentOS, Ubuntu , etcNo bash, use
$OSTYPE
e$HOSTTYPE
, conforme documentado; isto é o que eu faço. Se isso não for suficiente, e se evenuname
ouuname -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.fonte
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 de
Linux
se possa esperar.Você pode ver alguns exemplos adicionais nos meus dotfiles aqui
fonte
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-gnu
aqui :)fonte
Eu escrevi esses açúcares no meu
.bashrc
:Para que eu possa fazer coisas como:
fonte
if_nix gnu
&if_os linux
.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
ou
se você quiser mais informações
fonte
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:
em algumas máquinas diferentes:
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.fonte
Você pode usar o seguinte:
então você pode usar a variável do SO no seu script.
fonte
uname -s
é diferenteuname
?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.
Exemplo de saída para o Ubuntu Linux:
fonte
Deve ser seguro usá-lo em todas as distros.
Isso produz algo parecido com isto.
Extraia / atribua às variáveis como desejar
Nota: Em algumas configurações. Isso também pode fornecer alguns erros que você pode ignorar.
fonte
[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cat: /etc/*release: No such file or directory
tente isto:
fonte
cat: /etc/*-release: No such file or directory
zsh: no matches found: /etc/*release
- isso vai funcionar apenas para sistemas Linux, suponho ...Você pode usar a seguinte cláusula if e expandi-la conforme necessário:
fonte
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.
fonte
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )
isso funcionará sem gerar erros.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
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:
E eu tenho, por exemplo, um .bash_alias_Linux com:
Dessa forma, mantenho o código específico da plataforma e o portátil separados, você pode fazer o mesmo com o .bashrc
fonte
Isso verifica um monte de
known
arquivos para identificar se a distribuição Linux é Debian ou Ubunu, e o padrão é a$OSTYPE
variável.fonte
Fazer o seguinte ajudou a executar a verificação corretamente no ubuntu:
fonte