Bash et dash

[quote=“cactus”]Alors je pousse un petit coup de gueule contre dash (oui, directe j’ai tranché) et aussi contre la communauté Debian (pas taper) :

je ne suis pas d’accord sur le fait d’avoir remplacer /bin/sh -> bash par /bin/sh -> dash sans avoir averti EXPLICITEMENT, ni expliqué POURQUOI l’avoir fait ? A présent les scripts exécutés lancés directement, écrits en bash, ne FONCTIONNENT PLUS. C’est une REGRESSION. C’est nul.[/quote]
Reporte la régression vas-y on riras bien. La régression c’est d’avoir utilisé cet infâmes bash comme shell POSIX alors qu’il n’est absolument pas strict dans son émulation du shell POSIX.

Si tu veut faire des scripts bash, tu n’a qu’a le déclarer explicitement (et mettre le sheban en conséquence). Quand tu déclare ton script comme un script POSIX il doit se limiter à POSIX. /bin/sh a était conçu pour mettre n’importe quoi qui émule le shell POSIX derrière.

La décision est normal quand tu vois la piètre qualité des scripts shells inclus dans les distributions il y a 2 ans de ça. TOUS étaient écris pour bash alors qu’ils affirmaient être POSIX. Ce constat est lourd.

Tu remarqueras que depuis la création de dash celui-ci est de plus en plus utilisé en environnement Debian (Ubuntu est la première distribution a utiliser dash par defaut) mais aussi par d’autres (je crois par exemple que archlinux l’utilise et que fedora va s’y mettre si ce n’est pas déjà fait).

[quote=“Keldath”]Le Shell des utilisateurs restera Bash par défaut. Quand Debian annonce que Dash sera le nouveau Shell par défaut, ça concerne le lien symbolique /bin/sh qui pointera vers Dash. Par conséquent, tous les scripts ayant pour ligne shebang #!/bin/sh utiliseront Dash.
Par exemple, prenons un script d’init au pif, /etc/init.d/halt :

$ head -n 1 /etc/init.d/halt #! /bin/sh
/etc/init.d/halt utilisera le Shell pointé par le lien symbolique /bin/sh, et pour connaître ce Shell :

La commande de etxeberrizahar (# dpkg-reconfigure dash) ne fait que recréer le lien symbolique /bin/sh pour le faire pointer soit vers Bash (réponse “Non”), soit vers Dash (réponse “Oui”)

Quand un utilisateur ouvre un terminal, ou quand il se connecte en tty, c’est le Shell paramétré dans /etc/passwd qui sera utilisé :

$ grep $USER /etc/passwd…qui n’a rien à voir avec le Shell système /bin/sh comme vu plus haut.

J’ai bien compris et j’ai fait l’expérience en remplaçant bash par dash dans /etc/passwd pour ricardo.
Là, en effet, l’erreur reportée plus haut par Cactus est bien présente.
De plus, dash n’a pas de mémoire avec flèche haute — ptet une autre commande ?

Oui ricardo, c’est ce qui lui est reproché: pas d’historique. Il y a aussi la complétion qui n’est pas prise en charge pour l’instant.

Un$ ls -l /bin/sh te dira quel shell utilise ton système. Tu peux changer le lien et le faire pointer vers bash pour voir la différence de temps de boot.

P.S: Lit le début du topic, tu vas apprendre plein de trucs :wink:

[quote=“cactus”]Essayez la commande suivante en dash :
for (( i=1; i<10; i++ )); do echo -n $i" ";done;echo “”
dash: Syntax error: Bad for loop variable

en bash :
for (( i=1; i<10; i++ )); do echo -n $i" ";done;echo “”
1 2 3 4 5 6 7 8 9

il faut vérifier le lien /bin/sh, ou ré-écrire tout ses scripts. :013
[/quote]
Je ne comprend pas il te suffit de modifier la première ligne de ton programme???
tu changes !/bin/sh par #!/bin/bash et c’est tout, tu n’as pas besoin de tout récrire.

[quote=“ricardo”]Il doit bien y avoir une commande qui nous indique sur quoi on est (bash ou dash), non ?
Chez moi, les deux sont installés.[/quote]

echo $0 # ça marche pour dash et bash, je l’ignore pour zsh et d’autres.


Je m’intéresse tardivement à dash, et comprend enfin des heures d’arrachage de cheveux :017 ( d’ où l’entonnoir :wink: )

Il faut différencier:

  • les scripts systèmes ( dash ) plus rapides et plus conformes POSIX (portables et perennes )
  • ses scripts personnels ( dash | bash | perl | php … )
  • le shell interactif ( la ligne de commande: bash , zsh … )

Pour les scripts personnels anciens; il faut en effet remplacer la 1ère ligne ( /bin/sh par /bin/bash pour que les pb rentrent dans l’ordre

De mémoire: ( et plus )

  • dash ne connaît pas les tests [[ ]]
  • Opérateur de test: “=” et non “==” , -a et -o peuvent y être combinés.( contrairement à bash, plus “lourd” )
  • dash ne connaît pas le mot clé function: function nom () , mais seulement la syntaxe: nom ()
  • dash connaît la boucle for sous la syntaxe (différente ) suivante:
    for variable [ in [ word … ] ];do liste de commandes ; done
  • dash ignore le mot clé source, mais connaît le point: " [size=150].[/size] "
  • Un certain nombre de commandes intrinsèques de bash n’existent pas sous dash

[size=85]PS je suis arrivé sur ce fil en cherchant une comparaison des 2 langages; je complèterai ( peut-être ) cette 1ère courte liste si je persiste[/size]
https://wiki.ubuntu.com/DashAsBinSh [size=85]( faire une recherche avec le mot: “bashism” )[/size]

voir aussi: http://fr.wikipedia.org/wiki/Debian_Almquist_shell

[quote=“josephtux”][quote=“ricardo”]Il doit bien y avoir une commande qui nous indique sur quoi on est (bash ou dash), non ?
Chez moi, les deux sont installés.[/quote]

echo $0 # ça marche pour dash et bash, je l’ignore pour zsh et d’autres.[/quote]
Oui ça marche mais sinon utiliser :

Faut le dire vite ou alors mieux expliquer. Si c’est pour coder comme on le faisait avec le shell originel alors oui il est plus rapide. Si tu veut utiliser des bashismes alors bash est plus rapide qu’une version POSIX du shell et si on veut comparer à perl/python ça va dépendre des cas.

Pour ce qui est des scripts « systèmes », ça dépend. S’il est lancé avant le montage des partitions alors il va falloir utiliser un interpréteur qui est dans /bin, donc bash peut le faire. Si on cherche vraiment la compatibilité POSIX alors il faut aussi aller voir la documentation des outils POSIX comme pour ls :

disponible avec le paquet manpages-posix.

Pour ceux qui s’intéressent à Posix :
pubs.opengroup.org/onlinepubs/9699919799

Debian utilise Dash comme shell non-interactif par défaut. Il n’est pas conçu pour être utilisé de manière interactive par un
utilisateur …
Un shell non-interactif est utilisé pour exécuter des scripts de système ou des scripts utilisant #!/bin/sh shebang.
Donc, à ce moment-là, pourquoi il n’y a-t-il pas davantage de documentation, tutoriels etc. pour apprendre à faire des scripts de
système ou des scripts utilisant #!/bin/sh shebang. ?
Personnellement je trouve ça dommage
J’aimerais bien apprendre, Mais je dois bien dire que passer par le man me rebute assez.

à ce niveau de déterrage, on appelle ça de l’archéologie ^^

2 J'aime