Como manter o dotfiles independente do sistema?

21

Devido ao trabalho, comecei recentemente a usar o OS X e o configurei usando o homebrew para obter uma experiência semelhante à do Linux.

No entanto, existem algumas diferenças em suas configurações. Alguns só precisam estar no local em um sistema. Como meus dotfiles moram em um repositório git, eu queria saber que tipo de opção eu poderia definir, para que algumas configurações sejam lidas apenas para o sistema Linux e outras para o OS X.

Quanto aos dotfiles, estou me referindo, entre outros, a .bash_profilesou .bash_alias.

k0pernikus
fonte
Eu fiz isso com galhos git. Eu tenho um para o FreeBSD, Gentoo e Ubuntu. Mas isso não é o ideal.
Raphael Ahrens
@RaphaelAhrens Quero evitar uma solução baseada em filiais, pois ela pode divergir.
K0pernikus
Sim, você pode facilitar um pouco quando coloca o material específico do sistema em arquivos especiais. Mas como eu disse não é o ideal.
Raphael Ahrens
stackoverflow.com/questions/394230/... Você pode buscar por Darwin no OS X.
Raphael Ahrens
Minha abordagem basicamente se resume a if (exists rcfile.local); source rcfile.local; endif, traduzida para o arquivo rc apropriado. O principal arquivo rc tento manter o sistema independente, enquanto a .localversão possui configurações específicas do sistema. Se você quiser tudo isso em um único repositório, poderá ter os diretórios do sistema e vincular o rcfile.local ao que está no diretório correto.
Jw013 17/07/2013

Respostas:

22

Mantenha os arquivos de ponto o mais portáveis ​​possível e evite configurações ou comutadores dependentes do SO que exijam uma versão específica de uma ferramenta, por exemplo, evite a sintaxe GNU se você não usar o software GNU em todos os sistemas.

Você provavelmente encontrará situações em que é desejável usar configurações específicas do sistema. Nesse caso, use uma instrução switch com as configurações individuais:

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

Caso os arquivos de configuração de aplicativos arbitrários exijam opções diferentes, você pode verificar se o aplicativo fornece opções de compatibilidade ou outros mecanismos. Por vimexemplo, você pode verificar a versão e o nível do patch para suportar os recursos que versões anteriores ou versões compiladas com um conjunto de recursos diferente não possuem. Exemplo de fragmento de .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
fonte
uname -sé como uname. uname significa nome Unix.
Stéphane Chazelas
1
@StephaneChazelas Acontece que é ou é garantido em todos os sistemas e eu sempre posso largar o -s?
Marco
1
Sim, unamesozinho , tem sido a maneira canônica de fazer isso há décadas e é especificado pelo POSIX. O original uname(no PWB Unix) não teve nenhuma opção.
Stéphane Chazelas 17/07/2013
@StephaneChazelas Obrigado pelo esclarecimento, removi a -sresposta e lembre-me disso para meus futuros scripts.
Marco
É um detalhe relativamente menor e não diminui o ponto ilustrado pelo seu exemplo, mas essas aspas no vimrc setrealmente deveriam ser U + 201C e U + 201D em vez de U + 0022?
um CVn 22/07/2013
3

Se você se preocupa apenas com arquivos que são realmente executados, como .bash_profiles e amigos, você pode se safar usando, por exemplo, unamepara diferenciar com base no sistema em que o código é executado.

Por exemplo , completamente não testado e com a ressalva de que eu não tenho um OS X para experimentar, se você tiver atualmente no Linux:

alias ll='ls -lFA'

e no Mac OS X:

alias ll='ls -lFAx'

(onde os -xOS X lsfazem algo que o GNU ls faz por padrão), eles podem ser combinados em algo assim:

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

O único requisito, então, é que uname -sfuncione da mesma maneira (deve ser, pois ambos os sistemas são razoavelmente POSIX-y e uname-s é exigido pelo POSIX (obrigado Marco por apontar isso )) e que a sintaxe para ramificação de scripts de shell com base em uma comparação de string é o mesmo. Provavelmente você também pode testar com base em outros critérios; por exemplo, você pode procurar por / etc / lsb_release, verificar se / proc / sys / kernel / ostype contém "Linux" ou qualquer outro teste que você possa fazer.

um CVn
fonte
@RaphaelAhrens É Darwin, acabei de verificar.
K0pernikus
@RaphaelAhrens Como eu escrevi, eu não tenho um OS X para experimentar as coisas, então adotei um palpite para mostrar a ideia, em vez de gastar muito tempo com um detalhe relativamente insignificante que o OP pode descobrir trivialmente.
um CVn 17/07/2013
Wikipedia para o resgate en.wikipedia.org/wiki/Uname se alguém quiser o bash para Windows ou outras coisas.
Raphael Ahrens
1
A -oopção uname não é POSIX e falha em muitos sistemas, por exemplo, Solaris. -sé obrigatório no POSIX e da maneira mais compatível. IEEE Std 1003.1
Marco
2
OSTYPEnão está disponível em um shell POSIX. Ele irá falhar, por exemplo, em uma instalação padrão do FreeBSD e só pode ser usado em .bashrcou .zshrc. Ele não funciona de forma confiável em .profile, .aliasetc. Uma vez que estamos falando de compatibiliy aqui, eu aconselho a ir a maneira segura, em vez de depender de características particulares da Shell, que não são garantidos para estar disponível em todos os sistemas.
Marco