Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#1 Le 02/12/2006, à 00:47

Cathou

Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

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 smile

Mais s'il est en #!/bin/sh la réponse est que.. vous aurez la surprise smile

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 smile

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 neutral

Dernière modification par Cathou (Le 03/12/2006, à 19:14)

#2 Le 02/12/2006, à 01:02

mr_pouit

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Je déplace dans une section plus appropriée "Trucs et Astuces".

Pourrais-tu mettre un titre un peu plus explicite, pour que les lecteurs le retrouvent en utilisant la fonction recherche ? (désolé, je suis pas très imaginatif pour les titres, je peux pas t'aider tongue)

Si tu as le temps, je pense même qu'il faudrait mettre ça dans le wiki, car cette question risque de revenir très très très (oui, j'insiste lol) souvent (rien que pour l'installation manuelle des pilotes proprio ATI wink).


N'hésitez pas à venir sur #ubuntu-fr-devel et #u-classroom (FreeNode) !
Ma page perso -- Mon blog

Hors ligne

#3 Le 02/12/2006, à 01:18

Cathou

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

No problemo. Pour le wiki, il vaut mieux attendre quelques réponses non?

Déja, pour ATI je savais pas. Mais je peux pas dire que ça m'étonne, non plus lol

#4 Le 02/12/2006, à 20:36

skateinmars

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

A noter que la décision d'utiliser dash a été prise par les devs debian, pour gagner pas mal de temps au boot sans recourir à des logiciel comme pinit ou autres.

Hors ligne

#5 Le 02/12/2006, à 22:52

Geoffrey

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

$ limewire
runLime.sh: 44: Syntax error: "(" unexpected (expecting "}")

meme avec #!/bin/bash sad

Hors ligne

#6 Le 03/12/2006, à 15:17

jd

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Intéressant, merci.

À l'occasion, c'est un topo à ajouter au wiki.

Hors ligne

#7 Le 03/12/2006, à 15:36

cep

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2006-10-25 08:52 /bin/sh -> dash
:~# mv /bin/sh /bin/sh_bad
:~# ln -s /bin/bash /bin/sh

Hors ligne

#8 Le 03/12/2006, à 15:52

yugo

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Très bon post
Je comprends mieux maintenant.
@cep: je suis pas sur que t'ai eu une super idée là.


Dans la vie il y a 3 sortes d'imbéciles: ceux qui doutent de tout et ceux qui doutent de rien

Hors ligne

#9 Le 03/12/2006, à 15:58

cep

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Pourquoi ?
Tu gardes la souplesse. Tu fais le choix de dash ou bash. mv en cas de besoin.
Je préfère la simplicité et la compatibilité aux hypothétiques  gains de nanosecondes au démarrage.
C'était simplement une suggestion pour Cathou, à intégrer ou non à son tuto, d'ou l'absence de commentaires.

Hors ligne

#10 Le 03/12/2006, à 16:02

Cathou

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Oui cep, mais comment savoir si le remède n'est pas pire que le mal?

Indépendamment de la syntaxe, il y a la question de l'environnement.
N'y a-t-il pas un dashrc ou un profile qui risquerait d'introduire des effets de bords?
(Je pose la question, quant à moi je suis sous dapper)

Dans le doute, si on a plusieurs scripts à traiter dans la foulée, je suggère ceci:

# ln -sf /bin/bash /bin/sh

[traitement]

# ln -sf /bin/dash /bin/sh

A part ça, ce qui serait bien c'est un véritable parseur dash, si ça existe, à la place de la vérification naïve par dash -n

#11 Le 04/12/2006, à 10:55

cep

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Cathou a écrit :

N'y a-t-il pas un dashrc ou un profile qui risquerait d'introduire des effets de bords?
(Je pose la question, quant à moi je suis sous dapper)

Non. Tu as :
/bin/sh
détourné par dash vers : /bin/sh.distrib
/usr/share/man/man1/sh.1.gz
détourné par dash vers : /usr/share/man/man1/sh.distrib.1.gz

Je te laisse analyser bin/sh.distrib smile et man sh.distrib est apparement le man de bash

Et sur un etch :
:~$ ls -l /bin/*sh*
-rwxr-xr-x 1 root root 676384 2006-07-05 15:16 /bin/bash
lrwxrwxrwx 1 root root     21 2006-11-05 10:44 /bin/csh -> /etc/alternatives/csh
-rwxr-xr-x 1 root root  80200 2006-10-24 02:57 /bin/dash
lrwxrwxrwx 1 root root      4 2006-11-05 08:47 /bin/rbash -> bash
lrwxrwxrwx 1 root root      4 2006-11-05 08:47 /bin/sh -> bash
lrwxrwxrwx 1 root root     13 2006-11-05 10:22 /bin/tcsh -> /usr/bin/tcsh
lrwxrwxrwx 1 root root     21 2006-11-14 11:58 /bin/zsh -> /etc/alternatives/zsh
-rwxr-xr-x 1 root root 492708 2006-11-27 16:37 /bin/zsh-beta

Hors ligne

#12 Le 11/12/2006, à 04:25

Tseppy

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

J'ai effectivement ce problème en lancant limewire

runLime.sh: 44: Syntax error: "(" unexpected (expecting "}")

pourtant j'ai

#!/bin/bash
cd /usr/lib/LimeWire
sh runLime.sh

dans /usr/bin/limewire.sh

Hors ligne

#13 Le 11/12/2006, à 05:02

roger64

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

J'ai eu ce problème avec deux nautilus-scripts qui fonctionnaient sous Dapper et plus sous Edgy et auxquels il a fallu faire pointer vers bash.

Tuto très utile. smile

Un titre plus explicte serait peut-être aussi souhaitable? neutral

Dernière modification par roger64 (Le 11/12/2006, à 05:04)

Hors ligne

#14 Le 13/12/2006, à 22:12

Hexes

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Bonjour,

Dash est par défaut depuis longtemps sous Edgy?
J'ai fais une install de Edgy avec le CD d'install il y a 2 ou 3 mois et je suis avec bash (dans /etc/passwd, mon user a été délcaré avec bash...)


--
La météo est une science qui permet de connaître
le temps qu'il aurait dû faire.
[Philippe Bouvard]

Hors ligne

#15 Le 13/12/2006, à 22:46

gwenchlan-eire

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Hexes a écrit :

Bonjour,

Dash est par défaut depuis longtemps sous Edgy?
J'ai fais une install de Edgy avec le CD d'install il y a 2 ou 3 mois et je suis avec bash (dans /etc/passwd, mon user a été délcaré avec bash...)

Non non non !

Bash est LE shell par défaut de l'utilisateur... Beaucoup plus pratique que Dash, mais beaucoup plus lourd.

Par conséquent, pour les scripts systèmes du style de ceux d'Upstart c'est Dash qui est utilisé depuis Ubuntu Edgy , ce qui devrait donner un gain de performance, tant que les scripts sont bien conformes à la norme sh et pas bash.

Pour l'utilisateur lambda du shell tel que nous, c'est toujours /bin/bash la référence.

Dernière modification par gwenchlan-eire (Le 14/12/2006, à 19:04)

Hors ligne

#16 Le 14/12/2006, à 02:15

Hexes

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

gwenchlan-eire a écrit :
Hexes a écrit :

Bonjour,

Dash est par défaut depuis longtemps sous Edgy?
J'ai fais une install de Edgy avec le CD d'install il y a 2 ou 3 mois et je suis avec bash (dans /etc/passwd, mon user a été délcaré avec bash...)

Non non non !

Bash est LE shell par défaut de l'utilisateur... Beaucoup plus pratique que Dash, mais beacoup plus lourd.

Par conséquent, pour les scripts systèmes du style de ceux d'Upstart c'est Dash qui est utilisé depuis Ubuntu Edgy , ce qui devrait donner un gain de performance, tant que les scripts sont bien conformes à la norme sh et pas bash.

Pour l'utilisateur lambda du shell tel que nous, c'est toujours /bin/bash la référence.

Merci gwenchian-eire

Je n'avais effectivement pas compris ça en lisant la discussion...
Ceci dit effectivement mon sh pointe bien vers dash.

La boucle est bouclée wink


--
La météo est une science qui permet de connaître
le temps qu'il aurait dû faire.
[Philippe Bouvard]

Hors ligne

#17 Le 10/02/2007, à 02:44

Skippy le Grand Gourou

Re : Dash: le nouveau shell sh sous Edgy. Pour des scripts bien lessivés.

Yes ! Merci, je viens enfin de comprendre pourquoi bootchart ne fonctionne plus (à cause d'une seule ligne ! roll), et je crois que tu viens de m'éviter des heures de recherche google dans le futur ! wink (si seulement j'avais pu lire ce post hier... hmm)


Mais quand vont-ils tous se taire ?? (De l'indécence médiatique et de sa justification des crimes violents)
Touristes africains, vous n'êtes pas les bienvenus en France.
 

Hors ligne

Haut de page ↑