Il est plus facile de migrer un shell, qu'un script shell.
-- Larry Wall
Ce livre s'occupe principalement des scripts Bash sur un système GNU/Linux. De la même façon, les utilisateurs de sh et ksh y trouveront beaucoup d'idées de grande valeur.
Un grand nombre de shells et langages de scripts semblent converger vers le standard POSIX 1003.2. Appeler Bash avec l'option --posix ou insérer un set -o posix au début d'un script fait que Bash se conforme très étroitement à ce standard. Une autre alternative consiste à utiliser, dans le script, un en-tête sha-bang #!/bin/sh plutôt que #!/bin/bash [125] Notez que /bin/sh est un lien vers /bin/bash pour Linux ainsi que dans certaines autres versions d'UNIX et qu'un script appelé de cette façon désactive les fonctionnalités étendues de Bash.
La plupart des scripts Bash fonctionneront directement avec ksh, et vice-versa, car Chet Ramey a beaucoup travaillé sur le portage des fonctionnalités de ksh aux dernières versions de Bash.
Sur un UNIX commercial, les scripts utilisant les fonctionnalités spécifiques aux commandes standards GNU peuvent ne pas fonctionner. Ceci devient de moins en moins un problème ces dernières années car les outils GNU ont petit à petit remplacé les versions propriétaires même sur les UNIX « solides ». La publication des sources de nombreux outils de Caldera ne fera qu'accélérer la tendance.
Bash dispose de certaines fonctionnalités qui manquent au shell Bourne traditionnel. Parmi celles-ci :
Certaines options étendues d'appel
La substitution de commandes utilisant la notation $( )
Certain array operations, and associative arrays
The double brackets extended test construct
The double-parentheses arithmetic-evaluation construct
Certaines opérations de manipulations de chaînes
Un opérateur de correspondance pour les expressions rationnelles
Les commandes intégrées de Bash
Voir la FAQ de Bash pour une liste complète.
Mettons en lumière quelques-unes des incompatibilités entre Bash et le shell Bourne classique. Téléchargez et installez le « Shell Bourne de Heirloom » et lancez le script ci-dessous, d'abord sur Bash, ensuite sur le sh classique.
Exemple 36.21. Suite de test
#!/bin/bash # test-suite.sh # Un test partiel de compatibilité Bash. # Lancez-le sous Bash ou avec un autre shell. # Traduction : Jean-Philippe Guérard reponse_par_defaut=PAS_BON # Les tests ci-dessous échoueront à moins que... echo echo -n "Test " sleep 1; echo -n ". " sleep 1; echo -n ". " sleep 1; echo ". " echo # Double crochets Texte="Compatible avec les doubles crochets ?" echo -n "Test des doubles crochets : " if [[ "$Texte" = "Compatible avec les doubles crochets ?" ]] then echo "OK" else echo "PAS_BON" fi # Doubles crochets et expressions rationnelles Texte="Compatible avec les expressions rationnelles ?" echo -n "Test des expressions rationnelles : " if [[ "$Texte" =~ c.....expressions* ]] then echo "OK" else echo "PAS_BON" fi # Tableaux test_arr=$reponse_par_defaut # PAS_BON Array=( Affiche OK si compatible avec les tableaux ) test_arr=${Array[1]} echo "Test des tableaux : $test_arr" # Substitution de commandes test_sub_com () { echo "OK" } essai_sub_com=$reponse_par_defaut # PAS_BON essai_sub_com=$(test_sub_com) echo "Test de substitution de commandes : $essai_sub_com" echo # Terminer ce script est laissé en exercice pour le lecteur. # Ajoutez les tests pour les doubles parenthèses, le #+ développement d'accolades, la substitution de processus, #+ et cætera. exit $?