Jusqu'à ce mois-ci, mes configurations de shell étaient assez simples (juste un .bashrc
ou .bash_profile
avec quelques alias principalement), mais je l'ai refactorisé pour que je puisse obtenir un comportement différent selon que j'utilise zsh et bash. Ils source d'abord un fichier de configuration de shell générique qui devrait fonctionner pour n'importe quoi, puis se spécialisent pour le shell spécifique utilisé (je fais un lien symbolique vers cela).
J'ai été surpris aujourd'hui lorsque j'ai ls
cessé de travailler. Il s'est avéré que lors du refactoring .bashrc
, il y avait un alias
alias ls='ls --color=always'
qui cassait les choses pour ls
en bash sur Terminal dans OSX. Une fois que j'ai vu que BSD ls
aime la -G
couleur, mais que GNU (ou tout ce qui était sur Ubuntu) aime --color
, il était clair que plusieurs options diffèrent.
Ma question est la suivante: quelle est la meilleure façon de tenir compte des différences d'options et de telles différences entre BSD et GNU coreutils? Dois-je tester une variable env dans les if
blocs pour voir quel système d'exploitation est utilisé et appliquer le comportement correct? Ou est-il plus logique de créer des fichiers de configuration distincts pour chaque système d'exploitation?
Bien que les réponses à ces questions puissent être subjectives, il semble qu'un aperçu de la portée des différences entre les coreutils BSD et GNU et les stratégies pour les contourner afin de rendre une configuration générique utilisable sur la plupart des * nix serait assez objectif.
ls -c
est différent dels --color
. Modification de votre question à corriger.Réponses:
La seule façon fiable d'écrire des scripts qui prennent en charge différents systèmes d'exploitation est de n'utiliser que des fonctionnalités définies par POSIX.
Pour des choses comme vos configurations de shell personnelles, vous pouvez utiliser des hacks qui correspondent à votre cas d'utilisation spécifique. Quelque chose comme ce qui suit est moche, mais atteindra l'objectif.
la source
coreutils
explicitement, pourquoi ne pas simplement tester si le drapeau de couleur fonctionne, par exempleif ls --color=auto -d / >/dev/null 2>&1; then ...
.Littering le code avec des
if
instructions pour effectuer un changement sur le type de coreutils fonctionne, mais la solution de programmation propre pour gérer différents types est d'utiliser le polymorphisme . Comme il s'agit de Bash, nous n'avons pas de polymorphisme en soi, mais j'ai essayé de trouver un moyen de le simuler. La seule exigence est que votre.bashrc
fichier, etc. soit organisé en fonctions.Je crée d'abord un test pour le type de plateforme coreutils :
Ensuite, nous pouvons expédier en fonction du type:
Voici l' implémentation BSD :
(Notez que nous utilisons la
CLICOLOR
variable pour activer les couleurs au lieu d'utiliser unalias
, qui semble plus propre)Et l' impelementation GNU :
Par souci d'exhaustivité, voici un exemple d'implémentation de la "base abstraite":
la source
ls
plutôt dans votre répartiteur quecat
, d'autant plus qu'aucun de vos alias n'impliquecat
.--color=auto
de vos deuxième et troisième alias, car le premier alias ajoute cette option àls
.alias
c'était récursif. Cela me permet de rendre l'exemple beaucoup plus simple.Pas une réponse directe à votre question, mais j'ai des scripts wrapper pour gérer des choses comme ça plutôt que des complications supplémentaires dans le .bashrc Par exemple, voici mon script l qui gère votre cas ici d'une manière multiplateforme:
http://www.pixelbeat.org/scripts/l
la source