Como você determina se está em um sistema Linux ou BSD dentro de um script?

6

Eu tenho uma seleção bastante extensa de dotfiles que são mantidos em um repositório git por mais tempo - eu apenas mantenho uma ramificação separada de código para bsd-isms (por exemplo, no Linux, para obter saída ls colorida do ls --color=auto , mas em curtidas BSD incluindo Mac OS, é ls -g ).

Isso começou a se tornar difícil, já que eu tenho que fazer a mudança, depois mesclar ramificações e lidar com a resolução de conflitos toda vez que eu toco no arquivo rc do meu shell. A figura da maneira correta de lidar com isso seria descartar a ramificação do git e fazer com que meu arquivo rc determine em que tipo de SO está ativado e, então, criar um script addon apropriado para os aliases.

O problema é que não tenho ideia de como fazer isso.

Como posso saber se estou no Linux ou no BSD a partir de um script ou arquivo shell rc?

uname não funciona realmente desde então eu tenho que escrever um monte de lógica para os vários tipos de sistemas que estão por aí. Mac diz que Darwin, FreeBSD, etc, quando eu estou mais interessado no tipo subjacente de SO , já que isso afetará o conjunto específico de ferramentas com as quais estou lidando. Para o meu exemplo acima, estou usando o bsd ls ou o GNU ls ?

    
por Mikey T.K. 24.09.2013 / 18:15

2 respostas

10

Esta resposta de estouro de pilha por Nicolas Martyanoff fornece uma solução completa. Eu ajustei para usar a nova sintaxe mencionada nos comentários.

Determine o sistema operacional:

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

Escolha os sinalizadores corretos para ls :

if [ "$platform" = 'linux' ]; then

   alias ls='ls --color=auto'

elif [ "$platform" = 'freebsd' ]; then

   alias ls='ls -G'

fi
    
por 19.10.2018 / 06:49
0

Deixando de lado a detecção da plataforma (feita corretamente via uname ), não são apenas os sinalizadores que precisam ser selecionados corretamente, mas também o caminho para o executável.

Chamar apenas ls -G significa me fornecer qualquer alias / function / executable-found-in-$ PATH e executá-lo com o sinalizador -G . Esse alias / function / executable pode ou não ser BSD em um sistema operacional BDS, pode ou não seguir os argumentos do BDS, pode ou não ser exatamente a mesma versão que você espera, etc.

Por essa razão, um usuário usaria o caminho completo para o executável interno que tem uma chance realmente alta (o violino com o nível do sistema não é tão comum quanto mexer em aliases / functions / $ PATH) após o SO: /bin/ls -G .

    
por 02.03.2018 / 22:39