Toutes les variantes du langage Bourne shell sont objectivement terribles par rapport aux langages de script modernes tels que Perl, Python, Ruby, node.js et même (sans doute) Tcl. Si vous devez faire quelque chose, même un peu compliqué, vous serez plus heureux à long terme si vous utilisez l'un des éléments ci-dessus au lieu d'un script shell.
Le seul et unique avantage du langage shell sur ces nouveaux langages réside dans le fait qu’il est garanti que quelque chose qui s’appelle lui /bin/sh
- même existe sur tout ce qui est censé être Unix. Cependant, il se peut que quelque chose ne soit même pas conforme à POSIX; la plupart des Unixes propriétaires hérités ont gelé le langage mis en œuvre par /bin/sh
et les utilitaires dans le PATH par défaut avant les modifications demandées par Unix95 (oui, Unix95, il y a vingt ans). Il peut y avoir un ensemble d'Unix95, ou même de POSIX.1-2001 si vous êtes chanceux, des outils dans un répertoire ne se trouvant pas sur le chemin PATH par défaut (par exemple /usr/xpg4/bin
), mais leur existence n'est pas garantie.
Cependant, les bases de Perl sont plus susceptibles d'être présentes sur une installation Unix choisie arbitrairement que Bash. (Par "les bases de Perl", je veux dire /usr/bin/perl
existe et est une version peut-être assez ancienne de Perl 5, et si vous avez de la chance, les modules fournis avec cette version de l'interpréteur sont également disponibles.)
Par conséquent:
Si vous écrivez quelque chose qui doit fonctionner partout et qui est censé être Unix (comme un script "configure"), vous devez utiliser #! /bin/sh
, et vous ne devez utiliser aucune extension. De nos jours, j'écrirais un shell conforme à POSIX.1-2001 dans ce cas, mais je serais prêt à corriger les erreurs POSIXisms si quelqu'un demandait de l'aide pour le fer rouillé.
Mais si vous n'écrivez pas quelque chose qui doit fonctionner partout, alors au moment où vous serez tenté d'utiliser un quelconque Bashisme, vous devriez arrêter et réécrire le tout dans un meilleur langage de script. Votre futur moi vous en sera reconnaissant.
(Alors, quand est- il approprié d'utiliser des extensions Bash? Au premier ordre: jamais. Au second ordre: uniquement pour étendre l'environnement interactif Bash - par exemple pour fournir des commandes intelligentes pour compléter les onglets et fantaisie.)
#!/bin/sh
et n'utilisez rien d'autre que ce que le shell d'origine a fourni.