if [[ $(uname -s) == Linux ]]
then
doThis
else
doThat
fi
Na minha máquina principal, um MacBook Pro, tenho um arquivo .bash_profile
que gostaria de usar inalterado em minha máquina linux Dreamhost. No entanto, existem algumas linhas que são aplicáveis apenas ao macOS, como alias mvim="/Applications/MacVim.app/Contents/MacOS/MacVim"
.
Existe uma maneira no bash de testar se ele está sendo executado no macOS ou no Debian (ou simplesmente não no macOS) e somente executar essa linha acima, e alguns outros, quando rodando no macOS? Considerando que outras questões aqui abordam como descobrir qual distribuição Linux está sendo usada, aqui eu só preciso saber se estou rodando em macOS ou Linux, e as soluções para conhecer a distribuição Linux não estão disponíveis no macOS.
No OSX, uname -s
retorna Darwin
(a maioria dos programas uname
do Linux retorna Linux
).
Como regra geral (além do uso pessoal), uname
tem peculiaridades para sistemas diferentes. Em autoconf
, os scripts usam config.guess
, que fornece informações consistentes.
Por exemplo, no meu Debian 7,
x86_64-pc-linux-gnu
e no OSX El Capitan
x86_64-apple-darwin15.5.0
Você poderia usar instruções if-then-else no shell, ou uma declaração de caso. Estes últimos são mais facilmente mantidos, por exemplo,
case $(config.guess) in
*linux*)
DoSomeLinuxStuff
;;
*apple-darwin*)
DoSomeMacStuff
;;
esac
Muitas distribuições do Linux adicionam informações à saída de uname
, mas isso é útil apenas caso a caso. Não há não padrão para as informações adicionadas.
Para o meu Debian 7:
$ uname -v
#1 SMP Debian 3.2.81-1
enquanto o OSX é radicalmente diferente:
$ uname -v
Darwin Kernel Version 15.5.0: Tue Apr 19 18:36:36 PDT 2016; root:xnu-3248.50.21~8/RELEASE_X86_64
Leitura adicional:
Como uma solução alternativa, você pode tentar dividir seu .bash_profile
em uma parte portátil e em uma parte específica do sistema.
No seu principal .bash_profile
adicione o seguinte:
if [ -f ~/.bash_profile_local ] ; then
. ~/.bash_profile_local
fi
Em seguida, coloque as personalizações que se aplicam apenas a um determinado sistema em .bash_profile_local
nesse sistema. Se você não tiver personalizações, não será necessário criar o arquivo.
Ou, se você quisesse ir ainda mais longe e ter partes compartilhadas entre alguns sistemas, mas não outros, você poderia fazer um diretório rc.d estilo SYSV completo. Em .bash_profile
:
if [ -d ~/.bash_profile.d ] ; then
for f in ~/.bash_profile.d/* ; do
if [ -f "$f" ] ; then
. "$f"
fi
done
fi
Em seguida, crie um diretório .bash_profile.d
e todos os arquivos inseridos nele serão executados como se fossem parte de seu .bash_profile
.