Como posso determinar o sistema operacional dentro de .bash_profile? [duplicado]

6

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.

    
por Chuck 05.07.2016 / 01:58

3 respostas

10
if [[ $(uname -s) == Linux ]]
then
    doThis
else
    doThat
fi
    
por 05.07.2016 / 02:05
11

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:

por 05.07.2016 / 02:15
1

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 .

    
por 05.07.2016 / 06:53

Tags