De la différence entre bash et sh :
ABck à la question: Si vous avez
/bin/sh
un lien vers bash, alors bash ne se comportera pas de la même manière lorsqu'il est appelé/bin/sh
comme il le fait lorsqu'il est appelé comme/bin/bash
. Lorsqu'il est appelé en tant quesh
, il se limitera principalement à la conformité POSIX plus un ensemble limité d'extensions.
Est-ce que cela signifie que chaque fois que je rencontre un script shell sous Linux avec un shebang to sh:, #!/bin/sh
même si sur cette distribution, bin/sh
c'est un lien symbolique vers un autre shell, comme dash ou bash, il devrait être 100% compatible avec le bourne shell, car se limite-t-elle à un ensemble limité d'extension? Je pourrais donc les exécuter dans FreeBSD? Y a-t-il une exception à cela? Ou devrais-je être sûr de supposer que cela fonctionnera?
Donc, si sur une distribution, bin/sh
est un lien symbolique vers bin/bash
, et un script utilise #!/bin/sh
et le script contient bashism, il ne fonctionnera pas, car bash aimera être en mode sh?
la source
/bin/sh
comme shebang. Un script shell peut toujours utiliser explicitement/bin/bash
. Quoi qu'il en soit, la plupart des scripts shell fonctionneront probablement bien sous / bin / sh mais le problème sera les outils utilisateur, par exemple la plupart des scripts shell attendent GNU userland qui sera probablement plus un problème qu'une simple erreur de syntaxe. J'ai également ajouté un lien vers la référence bash qui répertorie les différents comportements en mode posixIl semble y avoir une certaine confusion autour du shell Bourne. Le shell Bourne était un shell Unix il y a des décennies, à l'époque pré-POSIX. De nos jours, "sh" est une implémentation ou une autre d'un shell qui implémente la spécification POSIX, parmi lesquels nous avons bash, pdksh, AT&T ksh, les plus récents shells Almquist et leurs dérivés qui ont été rendus conformes POSIX (y compris le "sh" de certains BSD) , d'autres BSD sh étant basés sur pdksh et Debian ash (tiret)). Même zsh a un mode dans lequel il est principalement conforme à POSIX.
Le shell Bourne n'est pas compatible POSIX et ne peut pas être trouvé sur de nombreux systèmes de nos jours. Où le shell Bourne est trouvé ou où il ne l'est pas, il y aura toujours un "sh" qui est compatible POSIX (et ne sera pas le shell Bourne), généralement
/bin
pendant qu'une exception notable (ennuyeuse) est Solaris.Notez qu'avant le Bourne shell, et nous parlons il y a plus de 30 ans, "sh" était le Thompson shell. Nous n'écrivons plus de scripts compatibles avec le shell Thompson. De même, nous devons arrêter de penser à "sh" comme le shell Bourne.
Maintenant "sh" est une spécification, pas beaucoup de variantes parfois incompatibles d'une implémentation. Cela facilite grandement l'écriture de scripts portables. Suivez simplement les spécifications .
Cela vaut pour "sh" et tous les utilitaires standards (sed, cut, tr ...)
la source
sed -r
. Sur les systèmes avec des utilitaires basés sur BSD, vous utilisezsed -E
. Sed de FreeBSD accepte les deux, mais Mac OS X seulement accepte-E
. Ainsi de suite.\(...\)\1
n'ont pas de traduction dans les ERE standard).\|
BRE. Je suis pour l'écriture la plus portable possible. Je ne faisais que l'observation (je pensais largement appréciée) que cela peut être douloureux, et parfois écrire à POSIX n'est tout simplement pas possible. Quelque part ont des liens qui présentent beaucoup de telles perversions; va les chercher.${VAR:=stuff...here}
mais que de nombreux shells ne vous le permettent pas, vous devez mettre des guillemetsstuff...here
.