La plupart du code que j'écris est en PHP. J'ai récemment commencé à apprendre les scripts shell. La plupart des ressources et des didacticiels que j'ai rencontrés sont spécifiques à Bash. Certains mettent en garde contre les bashismes et d'autres non. J'ai beaucoup lu ici et Stack Overflow.
Chaque fois qu'une réponse utilise des bashismes , quelqu'un commentera inévitablement:
Vous ne devez pas utiliser <insérer le bashisme ici>. Ce n'est pas portable.
Cela se produit même lorsque la question a été taguée bash. Pour moi, c'est comme dire à un programmeur PHP qu'il ne devrait pas utiliser de code nouveau dans PHP 5 car il ne peut pas être utilisé avec PHP 4. Ou dire à quelqu'un qu'il ne devrait pas écrire quelque chose pour Mac car il ne peut pas être utilisé sous Windows.
Lorsque j'écris en PHP, je choisis une exigence minimale et j'écris du code compatible avec l' avant . Je ne m'inquiète pas de le rendre compatible à l' envers .
Si j'utilise #!/bin/bash
comme shebang, pourquoi ne devrais-je pas utiliser des bashismes? Je commence à avoir l'impression que certaines personnes aiment bash bashismes (jeu de mots) juste pour le plaisir.
Les gens utilisent souvent bash
et de shell
manière interchangeable - probablement en raison du fait que bash est le shell par défaut sur de nombreux systèmes. Je peux donc comprendre l'ajout d'un commentaire pour avertir que le code utilise des bashismes, mais je ne comprends pas l'implication qu'il est mal de les utiliser.
Évidemment, si j'écris un script strictement pour un usage personnel, je peux l'écrire dans la langue que je veux. Mais j'aimerais penser qu'une partie du code que j'écris pourrait être utile à d'autres.
J'ai essayé de chercher une réponse à ma question avant de poster. J'ai trouvé beaucoup d'informations sur la façon de tester la portabilité, mais je n'ai rien trouvé sur le moment où il est important de le faire.
Alors, quand est-il important d'écrire des scripts portables?
Par exemple,
- quels types de scripts devraient être aussi portables que possible?
- Quelle est la fréquence des systèmes sur lesquels Bash n'est pas installé?
- si le système a installé Bash, aura-t-il également la version GNU de find et d'autres utilitaires?
la source
bash
balise seule, quelqu'un commente "C'est du bashisme et pas portable". Lorsque je réponds à une question étiquetéeC
, je me fiche que ce soit portableJava
ou non.bash
fonctionnalité spécifique et non portable, tout comme je voudrais souligner qu'une extension spécifique GNU est utilisée pour un utilitaire (même si la question a été étiquetée comme Linux). Je n'ai jamais vu personne dire "c'est un bashisme et vous ne devriez jamais l'utiliser".Réponses:
En tant que membre de cette communauté, je ne vois pas souvent de gens ignorer les bashismes pour les choses qui ciblent bash. Quand on parle de portabilité, les GNUismes sont bien pires que les bashismes. Tant que vous utilisez
bash
pour votre shebang, vous pouvez vous attendre à ce que le script soit exécuté en utilisantbash
. Cependant, vous ne pouvez garantir la version que si vous la vérifiez explicitement. La version 4 de Bash a apporté quelques fonctionnalités utiles telles que les tableaux associatifs, mais Bash v3 est toujours largement utilisé sous OS X et RHEL 5.Il s'agit davantage de vos besoins et de ce que vous choisissez de soutenir en tant que développeur. Si vous écrivez un script d'installation pour une application qui prend en charge tous les types de * NIX, la portabilité sera très importante.
FreeBSD et Solaris 10 sont des exemples de systèmes qui ne sont pas fournis avec bash installé par défaut. La plupart des systèmes Linux l'ont, à l'exception des systèmes embarqués.
Non, et c'est le vrai problème de portabilité. Si la portabilité est importante, vous ne devez utiliser que les fonctions de commande shell définies par la norme POSIX. Les utilitaires GNU peuvent être installés sur des systèmes non GNU tels que FreeBSD, mais ils ne seront probablement pas les premiers dans PATH, et vous ne pouvez pas compter sur ces outils pour être installés.
la source
find
et les autres utilitaires GNU spécifiques que j'avais utilisés? De toute évidence, ce ne serait pas convivial pour un script d'installation. Mais je pense simplement mettre quelque chose sur GitHub pour que les autres les saisissent s'ils le souhaitent. Je me fiche que ce ne soit pas portable sur tous les systèmes. Je ne veux tout simplement pas que cela soit inutile sur de nombreux systèmes.FIND=/opt/gnu/dispicable/bin/find
au début de votre script et que vous utilisez ensuite${FIND}
au lieu defind
dans votre script, vous donnez aux gens un (!) endroit pour mettre leurs chemins d'installation et faire en sorte que votre script utilise les bons outils.Lorsque vous les utilisez pour votre environnement de travail et que vous travaillez (ou pourriez dans le futur) sur différentes machines - ET, vous ne voulez pas avoir à réécrire vos outils avant de vous mettre au travail.
par exemple: un script poubelle /
rm
remplacementMark Stewart:
... pour ma boîte à outils de dépannage, je suppose que je n'aurai que vi et shell Korn. Et j'essaie d'utiliser des commandes qui fonctionnent sur la plupart des versions d'Unix.
la source