Quand est-il important d'écrire des scripts portables?

18

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/bashcomme 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 bashet de shellmaniè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?
toxalote
la source
4
J'ai voté pour cette question et y ai répondu, mais plus j'y pense que les 2 dernières questions correspondent au site. Les autres sont "principalement basés sur l'opinion".
jordanm
1
Il y a aussi un méta-aspect dans cette question: bien que cela ne puisse pas aider la réponse initiale à la question, des commentaires comme «ce n'est pas portable» peuvent être très utiles pour d'autres lecteurs qui trébuchent sur la question / réponse des mois ou des années plus tard.
Bananguin
2
@Bananguin Les commentaires disant "ce n'est pas portable" ne me dérangent pas. C'est juste un FYI. J'ai moi-même fait ce genre de commentaires. C'est le "Tu ne devrais pas utiliser ..." qui me dérange. Cela implique qu'il y a quelque chose de mal avec la réponse. Ce serait valable si la réponse recommandait un code obsolète, par exemple. Je me suis donc demandé ce qui n'allait pas avec Bash.
toxalot
2
+1. Surtout quand la question a une bashbalise seule, quelqu'un commente "C'est du bashisme et pas portable". Lorsque je réponds à une question étiquetée C, je me fiche que ce soit portable Javaou non.
PP
4
Je pense qu'il est toujours bon de souligner qu'il s'agit d'une bashfonctionnalité 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".
Martin Tournoij

Réponses:

15

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 bashpour votre shebang, vous pouvez vous attendre à ce que le script soit exécuté en utilisant bash. 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.

quels types de scripts devraient être aussi portables que possible?

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.

Quelle est la fréquence des systèmes sur lesquels Bash n'est pas installé?

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.

si le système a installé Bash, aura-t-il également la version GNU de find et d'autres utilitaires?

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.

jordanm
la source
1
Je pense que c'est plus sur SO qu'ici où je vois souvent des gens ignorer les bashismes . Je sais juste que je l'ai remarqué assez souvent pour me frustrer et me pousser à poser cette question.
toxalot
1
Donc, si les utilitaires GNU sont installés mais pas en premier dans PATH, existe-t-il un moyen de les appeler spécifiquement? Sinon, pourquoi les a-t-on installés?
toxalot
@toxalot: les binaires et les scripts sont appelés explicitement en utilisant des chemins absolus.
Bananguin
1
@Bananguin Donc, si quelqu'un avait installé les utilitaires Bash et GNU (mais pas dans PATH), il pourrait utiliser le script s'il le modifiait pour utiliser des chemins absolus findet 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.
toxalot
1
@toxalot: oui ça pourrait marcher. si vous mettez quelque chose comme FIND=/opt/gnu/dispicable/bin/findau début de votre script et que vous utilisez ensuite ${FIND}au lieu de finddans 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.
Bananguin
5

Alors, quand est-il important d'écrire des scripts portables?

quels types de scripts devraient être aussi portables que possible?

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 / rmremplacement


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

user3082
la source
3
J'aime certains des "Bash-isms", mais pour ma boîte à outils de dépannage, je suppose que je n'aurai que vi et Korn shell. Et j'essaie d'utiliser des commandes qui fonctionnent sur la plupart des versions d'Unix. De cette façon, je suis prêt à effectuer un triage sur un système malade sans avoir à vous soucier du comportement de la commande ps, que Bash ou Perl ou PHP soit là, ou où ils se trouvent.
Mark Stewart