Vous ne devriez utiliser que jamais #! /bin/sh
.
Vous ne devriez jamais utiliser d'extensions bash (ou zsh, ou fish, ou ...) dans un script shell.
Vous ne devriez jamais écrire que des scripts shell qui fonctionnent avec n'importe quelle implémentation du langage shell (y compris tous les programmes "utilitaires" associés au shell lui-même). De nos jours, vous pouvez probablement prendre POSIX.1-2001 (et non -2008) comme autorité pour tout ce que le shell et les utilitaires sont capables de faire, mais sachez que vous serez peut-être appelé un jour à porter votre script sur un système hérité (par exemple, Solaris ou AIX) dont la coque et les utilitaires ont été gelés vers 1992.
Quoi, sérieusement?!
Oui, vraiment.
Voici la chose: Shell est un langage de programmation terrible . La seule chose qui lui reste à faire, c’est /bin/sh
le seul et unique interprète de script que chaque installation Unix possède.
Voici l’autre chose: une certaine itération de l’interpréteur ( /usr/bin/perl
) Perl 5 principal est plus susceptible d’être disponible sur une installation Unix sélectionnée de manière aléatoire qu’elle ne l’ (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
est. D'autres bons langages de script (Python, Ruby, node.js, etc. - Je vais même inclure PHP et Tcl dans cette catégorie lors de la comparaison avec un shell) sont aussi à peu près aussi disponibles que bash et d'autres shells étendus.
Par conséquent, si vous avez la possibilité d'écrire un script bash, vous avez la possibilité d'utiliser un langage de programmation qui n'est pas terrible, à la place.
Maintenant, de simples scripts shell, du genre qui ne fait que lancer quelques programmes dans l'ordre d'un job cron ou autre, rien de mal à les laisser en tant que scripts shell. Mais les scripts shell simples n'ont pas besoin de tableaux, de fonctions ou [[
même. Et vous ne devriez écrire des scripts shell compliqués que lorsque vous n'avez pas d'autre choix. Les scripts Autoconf, par exemple, sont toujours des scripts shell. Mais ces scripts doivent être exécutés à chaque incarnation /bin/sh
correspondant au programme en cours de configuration. et cela signifie qu'ils ne peuvent utiliser aucune extension. Vous n'avez probablement pas à vous soucier des anciens Unix propriétaires, mais vous devriez probablement vous soucier des BSD Open Source actuels, dont certains ne sont pas installésbash
par défaut, et les environnements intégrés qui ne vous donnent qu'un shell minimal et busybox
.
En conclusion, au moment où vous vous trouvez à vouloir une fonctionnalité qui n’est pas disponible dans le langage shell portable, c’est le signe que le script est devenu trop compliqué pour rester un script shell. Réécris-le plutôt dans une meilleure langue.
bash
fonctions et une syntaxe plutôt que dessh
fonctions et une syntaxe.