Até este mês, minhas configurações de shell eram bastante simples ( principalmente com .bashrc
ou .bash_profile
com alguns aliases), mas eu a refatorava para que eu pudesse ter um comportamento diferente, dependendo de estar usando zsh e bash. Eles primeiro fornecem um arquivo de configuração de shell genérico que deve funcionar para qualquer coisa, depois se especializam para o shell específico que está sendo usado (eu ligo para isso).
Fiquei surpreso hoje quando ls
parei de trabalhar. Verificou-se que durante a refatoração .bashrc
havia um apelido
alias ls='ls --color=always'
que estava quebrando coisas ls
no bash no Terminal no OSX. Quando vi que o BSD ls
gosta -G
de cores, mas o GNU (ou o que quer que estivesse no Ubuntu) gosta --color
, ficou claro que muitas opções diferem.
Minha pergunta é: qual é a melhor maneira de explicar as diferenças de opções entre os coreutils do BSD e do GNU? Devo testar uma variável env em if
blocos para ver qual sistema operacional está sendo usado e aplicar o comportamento correto? Ou faz mais sentido criar arquivos de configuração separados para cada sistema operacional?
Embora as respostas a essas perguntas possam ser subjetivas, parece um resumo do escopo das diferenças entre os coreutils do BSD e do GNU e as estratégias para contorná-las para tornar uma configuração genérica utilizável na maioria dos * nix seriam bastante objetivas.
ls -c
é diferente dels --color
. Editou sua pergunta para corrigir.Respostas:
A única maneira confiável de escrever scripts que suportam sistemas operacionais diferentes é usar apenas os recursos definidos pelo POSIX.
Para coisas como suas configurações pessoais de shell, você pode usar hacks adequados ao seu caso de uso específico. Algo como o seguinte é feio, mas alcançará o objetivo.
fonte
coreutils
explicitamente, por que não testar apenas se a bandeira de cores funciona, por exemploif ls --color=auto -d / >/dev/null 2>&1; then ...
.Sujar o código com
if
instruções para executar uma alternância no tipo de coreutils funciona, no entanto, a solução de programação limpa para lidar com diferentes tipos é usar o polimorfismo . Como esse é o Bash, não temos polimorfismo em si, mas tenho andado brincando com uma maneira de falsificá-lo. O único requisito é que seu.bashrc
arquivo etc. seja organizado em funções.Primeiro, crio um teste para o tipo de plataforma coreutils :
Em seguida, podemos despachar com base no tipo:
Aqui está a implementação do BSD :
(Observe que usamos a
CLICOLOR
variável para ativar as cores em vez de usar umalias
, que parece um limpador menor)E a impelementação GNU :
Para completar, aqui está uma implementação de exemplo da "base abstrata":
fonte
ls
seu expedidor em vez decat
, especialmente porque nenhum dos seus pseudônimos envolvecat
.--color=auto
do seu segundo e terceiro aliases, pois o primeiro alias adiciona essa opção als
.alias
era recursivo. Isso me permite tornar o exemplo muito mais simples.Não é uma resposta direta à sua pergunta, mas eu tenho scripts de wrapper para lidar com coisas assim, em vez de complicação extra no .bashrc. Por exemplo, aqui está o meu script l que lida com o seu caso aqui de uma maneira multiplataforma:
http://www.pixelbeat.org/scripts/l
fonte