web-dev-qa-db-fra.com

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

Étant donné que POSIX est la chose la plus proche d'une norme commune à toutes les unités, je suis intéressé de 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 sans problème des scripts conformes POSIX), ils ne font pas du bon travail pour signaler les fonctionnalités non conformes.

Existe-t-il un shell qui implémente POSIX et POSIX uniquement, de telle sorte qu'il génère 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à ce point. J'ai pensé à cette question quand j'ai découvert que bash a un --posix option mais seulement pour découvrir qu'elle n'affecte que certains comportements d'initialisation, ce qui n'est pas exactement ce que je recherche.

78
rahmu

Malheureusement, "portable" est généralement une exigence plus forte que "compatible POSIX" pour les scripts Shell. Autrement dit, écrire quelque chose qui s'exécute sur n'importe quel shell POSIX n'est pas trop difficile, mais le faire fonctionner sur n'importe quel shell du monde réel est plus difficile.

Vous pouvez commencer par installer chaque Shell dans votre gestionnaire de paquets, en particulier posh ressemble à ce que vous voulez (Shell ordinaire conforme à la politique). La politique de Debian est POSIX à quelques exceptions près (echo -n spécifié, local...).

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

Je recommanderais le Autoconf guide to portable Shell , qui est absolument génial et fait gagner beaucoup de temps. De gros morceaux sont obsolètes, mais c'est OK; sautez simplement TruUnix et Ultrix et ainsi de suite si vous ne vous en souciez pas!

38
Nicholas Wilson

Vous pouvez utiliser ShellCheck (GitHub) comme linter pour vos scripts Shell. Il y a aussi un 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.
33
johnLate

Bash s'exécutera en mode compatible POSIX si le POSIXLY_CORRECT la variable d'environnement est définie. Depuis 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 honoreront également POSIXLY_CORRECT, donc si vous êtes sur un système avec principalement GNU (par exemple la plupart des systèmes Linux), c'est un bon début si votre objectif est la conformité POSIX.

12
James Sneeringer