Comment garder les fichiers dot-agnostic?

21

En raison de mon travail, j'ai récemment commencé à utiliser OS X et je l'ai configuré en utilisant homebrew afin d'obtenir une expérience similaire à celle de Linux.

Cependant, il existe de nombreuses différences dans leurs paramètres. Certains n'ont besoin d'être installés que sur un seul système. Comme mes fichiers de points vivent dans un référentiel git, je me demandais quel type de commutateur je pouvais mettre en place, de sorte que certaines configurations ne soient lues que pour le système Linux et d'autres pour OS X.

En ce qui concerne les fichiers dot, je me réfère, entre autres, à .bash_profilesou .bash_alias.

k0pernikus
la source
Je l'ai fait avec des branches git. J'en ai un pour FreeBSD, Gentoo et Ubuntu. Mais ce n'est pas idéal.
Raphael Ahrens
@RaphaelAhrens Je veux éviter une telle solution basée sur une branche car elle est sujette à des divergences.
k0pernikus
Oui, vous pouvez le rendre un peu plus facile lorsque vous placez les éléments spécifiques au système dans des fichiers spéciaux. Mais comme je l'ai dit pas idéal.
Raphael Ahrens
stackoverflow.com/questions/394230/… Vous pouvez vérifier Darwin sur OS X.
Raphael Ahrens
Mon approche se résume essentiellement à if (exists rcfile.local); source rcfile.local; endif, traduite dans le fichier rc approprié. Le fichier rc principal j'essaie de garder le système indépendant, tandis que la .localversion a des paramètres spécifiques au système. Si vous voulez tout dans un seul dépôt, vous pouvez avoir des répertoires système et lier symboliquement le fichier rcfile.local à celui du répertoire approprié.
jw013

Réponses:

22

Gardez les fichiers dot aussi portables que possible et évitez les paramètres dépendants du système d'exploitation ou les commutateurs qui nécessitent une version particulière d'un outil, par exemple évitez la syntaxe GNU si vous n'utilisez pas le logiciel GNU sur tous les systèmes.

Vous rencontrerez probablement des situations où il est souhaitable d'utiliser des paramètres spécifiques au système. Dans ce cas, utilisez une instruction switch avec les paramètres individuels:

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

Dans le cas où les fichiers de configuration d'applications arbitraires nécessitent différentes options, vous pouvez vérifier si l'application fournit des commutateurs de compatibilité ou d'autres mécanismes. Pour vim, par exemple, vous pouvez vérifier la version et le niveau de correctif pour prendre en charge les fonctionnalités plus anciennes, ou les versions compilées avec un ensemble de fonctionnalités différent, ne l'ont pas. Exemple d'extrait de .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
la source
uname -sc'est comme uname. uname signifie nom Unix.
Stéphane Chazelas
1
@StephaneChazelas Il se trouve que c'est ou est-il garanti sur tous les systèmes et je peux toujours laisser tomber -s?
Marco
1
oui, unameseul est le moyen canonique de le faire depuis des décennies et est spécifié par POSIX. L'original uname(dans PWB Unix) n'a pris aucune option.
Stéphane Chazelas
@StephaneChazelas Merci pour la clarification, j'ai supprimé le -sde cette réponse et je le garderai à l'esprit pour mes futurs scripts.
Marco
C'est un détail relativement mineur et ne porte pas atteinte au point illustré par votre exemple, mais ces citations dans le vimrc setsont- elles vraiment censées être U + 201C et U + 201D plutôt que U + 0022?
un CVn du
3

Si vous ne vous préoccupez que des fichiers réellement exécutés, tels que .bash_profiles et amis, vous pourrez peut-être vous en sortir, par exemple unamepour vous différencier en fonction du système sur lequel le code s'exécute.

Par exemple , complètement non testé et avec la mise en garde que je n'ai pas d'OS X pour essayer, si vous en avez actuellement sur Linux:

alias ll='ls -lFA'

et sur Mac OS X:

alias ll='ls -lFAx'

(où -xoblige OS X à lsfaire quelque chose que GNU ls fait par défaut), alors ils peuvent être combinés en quelque chose comme ceci:

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...

La seule exigence est alors que cela uname -sfonctionne principalement de la même manière (il devrait, puisque les deux systèmes sont raisonnablement POSIX-y et uname -s est requis par POSIX (merci Marco de l' avoir signalé )), et que la syntaxe de branchement des scripts shell basé sur une comparaison de chaînes est le même. Vous pouvez également tester en fonction d'autres critères; par exemple, vous pouvez rechercher / etc / lsb_release, vérifier si / proc / sys / kernel / ostype contient "Linux", ou tout autre test que vous pouvez proposer.

un CVn
la source
@RaphaelAhrens C'est Darwin, je viens de vérifier.
k0pernikus
@RaphaelAhrens Comme je l'ai écrit, je n'ai pas d'OS X pour essayer les choses, j'ai donc pris une supposition folle pour montrer l'idée plutôt que de passer beaucoup de temps sur un détail relativement insignifiant que l'OP peut découvrir trivialement.
un CVn
Wikipedia à la rescousse en.wikipedia.org/wiki/Uname si quelqu'un d'autre veut y bash pour Windows ou autre.
Raphael Ahrens
1
Le -ocommutateur uname n'est pas POSIX et échoue sur de nombreux systèmes, par exemple Solaris. -sest obligatoire sur POSIX et la manière la plus compatible. IEEE Std 1003.1
Marco
2
OSTYPEn'est pas disponible dans un shell POSIX. Il échouera par exemple sur une installation par défaut de FreeBSD et ne peut être utilisé que dans .bashrcou .zshrc. Cela ne fonctionne pas de manière fiable dans .profile, .aliasetc. Comme nous parlons ici de compatibilité, je vous conseille de suivre la voie la plus sûre, au lieu de vous fier aux fonctionnalités particulières du shell, qui ne sont pas garanties d'être disponibles sur tous les systèmes.
Marco