Sous dapper et les versions antérieures d'ubuntu, /bin/sh est un lien symbolique vers /bin/bash
Sous edgy en revanche, /bin/sh pointe vers /bin/
dash
Dash (Debian Almquist Shell) est un shell compatible avec sh et qui a l'avantage d'être très rapide et peu gourmand en mémoire.
Ainsi, un script qui commence par
#!/bin/sh sera interprété par dash sous edgy.
Malheureusement, une pratique
extrêmement répandue chez les auteurs de tels scripts consiste à supposer que ceux-ci seront en fin de compte interprétés par bash, et à y inclure des éléments de syntaxe qui sont propres à ce dernier ("bashismes").
Evidemment c'est une mauvaise habitude, puisque le contenu de l'emballage ne correspond pas à ce qui est marqué sur l'étiquette.
Et bien entendu, quand dash tombe sur un bashisme, il s'arrête net et signale une erreur de syntaxe: ces scripts se retrouvent
cassés sous edgy.
La position d'ubuntu pourrait se résumer ainsi: "Pour Edgy et toutes les versions ultérieures, dash sera utilisé. Tous les scripts conformes à la syntaxe sh seront ainsi exécutés avec des performances optimales. Que demandez-vous de plus?"
Il semble que les gens d'ubuntu se montrent intraitables à ce sujet.
Hélas, bon nombre de programmes d'installation, et particulièrement d'installation de
pilotes matériels pour linux, sont souvent des scripts. Pour leurs auteurs, c'est une méthode simple qui leur épargne les spécificités de telle ou telle distribution (paquets).
Comment savoir si un script contient des bashismes? Bien entendu, si le script est en
#!/bin/bash, il est probable qu'il en contienne beaucoup, mais c'est ce qu'on lui demande 🙂
Mais s'il est en
#!/bin/sh la réponse est que.. vous aurez la surprise 🙂
Parce que dans quelques temps vous aurez oublié ces quelques lignes, ou que vous n'aurez même pas visualisé le script avant de le lancer, ou que vous serez impatient de lancer le script via sudo qui sera sensé vous faire profiter de votre nouveau matériel, les raisons ne manquent pas 🙂
Un exemple:
./install.sh: 71: Syntax error: "(" unexpected
Typique: une définition de fonction ne se rédige pas de la même manière en bash qu'en sh
Seulement ce genre de surprises, quand le script a été lancé avec sudo, par exemple pour compiler et installer un module noyau, ça peut donner des sueurs froides..
Si vous venez de passer à edgy et que vous constatez que "tiens, ce script marchait sous dapper et maintenant il ne marche plus" alors dans ce cas, précisément, il vous suffit d'éditer le script et de remplacer purement et simplement le
#!/bin/sh de la première ligne par
#!/bin/bash et ce faisant, vous ne prenez aucun risque.
Mais quand vous n'êtes pas sûr, comment faire? Ceci peut aider à détecter les bashismes:
dash -n le_script
C'est la méthode 'noexec' de dash, au cours de laquelle ce dernier se contente de vérifier la syntaxe du script sans rien exécuter, et qui s'arrêtera à la première erreur de syntaxe de la même manière que si l'exécution avait effectivement lieu.
La décision des gens d'ubuntu d'opérer à un ravalement de façade en imposant dash a des arguments en sa faveur. Néanmoins, elle a été prise en faisant abstraction de l'existant, et tout le poids de cette décision va retomber sur la communauté ubuntu: dans les forums, les gens sous edgy qui essaient d'installer des pilotes, particulièrement les newbies, ou ceux qui essaient de les aider, sont déroutés. Et comme dapper est LTS, et que les migrations vont s'étaler dans le temps, ceci va perdurer.
Autant le signaler maintenant, donc 😐