Qu'est-ce qui n'est pas spécifique au shell?

9

Sous certaines réponses, je vois des commentaires qui recommandent d'éviter les commandes spécifiques au shell dans les réponses.

Comment savoir quelles commandes, opérateurs, etc. existent dans tous les shells? Existe-t-il une liste de normes?

  • man builtinsdonne une liste de commandes. Est-ce que ce sont les seules commandes que je peux utiliser dans un script shell portable qui fonctionne dans tous les shells?
  • Un intégré peut-il être spécifique au shell?
  • Les normes pour Linux diffèrent-elles de celles des autres Unix?
  • Et la syntaxe? La ponctuation, les opérateurs, etc. peuvent-ils être différents dans certains shells?
musa
la source

Réponses:

12

Le wiki de Greg a un article sur l'adaptation des scripts bash pour Dash qui souligne beaucoup de `` bashismes '' - des fonctionnalités supplémentaires qui ne sont pas standard mais qui font partie de bash. Éviter ces bashismes peut aider à rendre votre script plus convivial pour différents environnements. Cela répond particulièrement à certaines de vos questions. Par exemple, oui, il existe des opérateurs qui diffèrent (comme ==), mais il existe un ensemble Posix standard qui devrait fonctionner dans tous les environnements.

Pour une lecture plus approfondie, vous pouvez consulter la norme Posix , à laquelle tous les obus doivent se conformer. En particulier, le volume sur "Shell & Utilities".

Ce que je trouve plus difficile que les différences de shell sont les différences de commande. De nombreux systèmes Linux ont GNU find, mais si vous écrivez un script portable, ne comptez pas sur le vôtre man find, car il existe de nombreux systèmes avec BSD find, qui a un ensemble de fonctionnalités différent. Si vous écrivez des scripts pour busybox, vous constaterez qu'il existe différentes versions avec des ncs entièrement différents . Voilà le genre de choses qui m'attirent toujours lorsque je déploie un script dans différents environnements.

Pour plus de lecture sur les bonnes pratiques de script shell, il existe également une bonne ressource sur le blog de David Pashley: Writing Robust Bash Shell Scripts

Assurez-vous également de lire les réponses et les commentaires de Gilles sur ce site. Il a beaucoup de conseils pour s'assurer que vous utilisez du code portable.

Shawn J. Goff
la source
5

L'écriture d'un script shell dans un shell spécifique signifie que ce shell est installé. La seule norme est d'avoir cshet d' shinstaller sur toutes les variantes Unix. Donc, si vous voulez que votre script s'exécute sur Solaris, * BSD et GNU, vous devrez l'écrire, disons, dans le shell Bourne.

Cependant, la plupart des commandes Unix ont des syntaxes différentes sous différentes implémentations - regardez pssous Solaris, FreeBSD et GNU - donc selon les outils que vous utilisez, votre script peut ne pas être portable de toute façon. L'endroit où le shell est installé importera également. Est-ce /bin/bash /usr/bin/bash, /usr/local/bin/bashou ailleurs?

Je ne connais aucune norme définissant un shell. Jetez un œil à rc ou http://192.220.96.201/es/es-usenix-winter93.html`">es pour les coquilles non standard étranges. Cependant, celles-ci semblent toujours conformes à certaines idées courantes.

Sardathrion - contre les abus SE
la source
7
POSIX définit sh.
Random832