Comment puis-je tester la conformité POSIX des scripts shell?

72

Considérant que POSIX est la chose la plus proche d'un standard commun à tous les ordinateurs, je voudrais savoir s'il existe un shell qui le prend en charge exclusivement. Bien que la plupart des shells modernes prennent en charge POSIX (et exécutent les scripts compatibles POSIX sans aucun problème), ils ne font pas un bon travail pour signaler les fonctionnalités non conformes.

Existe-t-il un shell qui n'implémente que POSIX et POSIX, de manière à générer une erreur pour toute fonctionnalité non conforme?

EDIT Je tiens à préciser que je ne demande pas de conseils généraux pour écrire des scripts shell portables. La question connexe mentionnée dans les commentaires couvrait déjà cela. J'ai pensé à cette question quand j'ai découvert qu'il y bashavait une --posixoption, mais seulement pour découvrir que cela n'affecte que certains comportements d'initialisation, ce qui n'est pas exactement ce que je recherche.

Rahmu
la source
4
Connexes: ressources pour la programmation shell portable
Gilles «SO - arrête de faire le mal»
@ Gilles: Je devrais peut-être mentionner que je suis tombé sur cette question, mais une seule réponse a suggéré de tester avec dash. J'ai mentionné la transférabilité comme contexte général de ma question, mais ce n'était pas sa véritable intention.
Rahmu
Bien sûr, je voulais que les deux questions soient liées car elles pourraient intéresser les mêmes personnes. Ils ne sont en aucun cas des doublons. En passant, posh est un meilleur test de conformité POSIX que dash.
Gilles, arrête de faire le mal
2
busybox est assez proche de POSIX et POSIX uniquement. Une chose qui peut vous faire trébucher est que si vous installez également d’autres paquetages (comme diffutils), il pourrait ajouter des fonctionnalités. Commander livecd alpine linux qui commence avec un environnement busybox pur. Alpine utilise la bibliothèque musl C pour éviter les extensions GNU pouvant ajouter des fonctionnalités telles que les expressions régulières étendues.
Michael Fox

Réponses:

37

Malheureusement, "portable" est généralement une exigence plus stricte que "compatible POSIX" pour les scripts shell. C'est-à-dire qu'écrire quelque chose qui tourne sur n'importe quel shell POSIX n'est pas trop difficile, mais le faire tourner sur n'importe quel shell réel est plus difficile.

Vous pouvez commencer par installer chaque shell de votre gestionnaire de paquets, en particulier les poshsons de debian ressemblant à ce que vous voulez ( shell ordinaire conforme à la politique). La politique de Debian est POSIX à quelques exceptions près ( echo -nspécifié, local...).

Au-delà de cela, les tests doivent couvrir quelques shell (en particulier / bin / sh) sur diverses plates-formes. Je teste sur Solaris (/ bin / sh et xpg4 / sh) et BSD. AIX et HP-UX sont très compatibles et ne posent aucun problème. bash est un petit monde à part.

Je recommanderais le guide Autoconf sur les coques portables , qui sont absolument géniaux et permettent de gagner beaucoup de temps. De gros morceaux sont obsolètes, mais ce n'est pas grave; sautez TruUnix et Ultrix et ainsi de suite si vous ne vous en souciez pas!

Nicholas Wilson
la source
poshsonne en effet ce que je demande. Je vais faire des tests dès que je peux.
Rahmu
1
J'ai répondu avant de repérer la question connexe! posh est une chose debian, ne sera donc pas packagé sur tous les systèmes. En outre, la coquille n'est pas nécessairement la chose à laquelle on s'inquiète le plus; Les incompatibilités sed sont un gros problème, par exemple.
Nicholas Wilson
Je ne prendrais pas la peine de porter sur Solaris / bin / sh dit Bourne shell (qui n'est pas POSIX). Solaris, comme tous les ordinateurs modernes, a un shell POSIX, mais il se trouve que ce n'est pas à l'emplacement habituel (/ usr / xpg4 / bin / sh)
Stéphane Chazelas
Malheureusement, nous livrons des scripts qui doivent s’exécuter au moins tous les / bin / sh. Ce n'est pas aussi grave que tout ça ... Je préférerais ne pas avoir à le faire.
Nicholas Wilson
2
La raison pour laquelle je considère que / bin / sh est important est qu’elle est invoquée à partir du shebang dans de nombreux scripts. "/ usr / bin / env sh" n’est guère une amélioration. Si vous vous efforcez de faire fonctionner quelque chose sur des shells non-POSIX, je pense que je pourrais aussi bien donner la priorité à chaque système / bin / sh. Il ne faudra pas longtemps avant que certains clients exécutent votre script avec le shell par défaut, ce qui n’est pas déraisonnable.
Nicholas Wilson
28

Vous pouvez utiliser ShellCheck (GitHub) en tant que linter pour vos scripts de shell. Il existe également une version en ligne .

Pour détecter les problèmes de compatibilité POSIX (par exemple, SC2039 ), la ligne shebang de votre script shell doit être #!/bin/sh. Vous pouvez également passer --shell=shà shellcheck.

Exemple ( test.sh):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

Résultat ( shellcheck test.sh):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.
johnLate
la source
1
Toutes ces années et je n'ai jamais entendu parler de ShellCheck ... merci pour le lien!
Ton van den Heuvel
Le meilleur outil de tous les temps! Surtout en avoir une version en ligne est génial pour vérifier rapidement un morceau de code!
Mecki
12

Bash s'exécutera en mode compatible POSIX si la POSIXLY_CORRECTvariable d'environnement est définie. De la page de manuel:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

De nombreux autres utilitaires GNU seront également honorés POSIXLY_CORRECT. Ainsi, si vous utilisez un système avec principalement des outils GNU (comme la plupart des systèmes Linux), ceci est un bon début si votre objectif est la conformité POSIX.

James Sneeringer
la source
21
Même en mode POSIX, bash autorisera certaines fonctionnalités non-POSIX telles que [[.
Jordanie