# \[Bash ou Dash !?\] Attention au shell exécutant les scripts !

**URL:** <https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546 "2016-02-21T00:44:20Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/1 "2016-02-21T00:44:20Z")

</div>

Bonjour,

Je viens de mettre à jour, y’a deux jours, mon serveur Debian - stable - qui est donc passé de Lenny à Squeeze, tout naturellement 😛 (so much)  
J’ai bien noté qu’il m’était proposé à Dash par défaut - ce que j’ai accepté. Soit!

Depuis, certains scripts bash refusent de fonctionner correctement.  
Mais comme je les initialise tous, par la première ligne de déclaration suivante #!/bin/bash, cela ne devrait pas poser de problème en soi - non ?!

Exemple :

> [@](#):
>
> #!/bin/bash
> 
> # 
> 
> # Modifié le 26.01.2011 à 10:48
> 
> # 
> 
> # this script is linked with script sauvegarde\_rsync\_module2
> 
> declare -a DIR2CIFS=«&nbsp;/mnt/smb/FreeNAS/srvr-crocolion&nbsp;»  
> declare -a RSYNC\_OPTIONS=«&nbsp;-avcRHKz --delete-during --delete-excluded --ignore-errors --force --numeric-ids --partial --stats --timeout=900&nbsp;»  
> declare -a DIR2BCKP=«&nbsp;()&nbsp;»
> 
> declare -a mount=«&nbsp;/bin/mount&nbsp;»  
> declare -a umount=«&nbsp;/bin/umount -l&nbsp;»
> 
> DIR2BCKP[0]=«&nbsp;etc&nbsp;»  
> DIR2BCKP[1]=«&nbsp;home&nbsp;»  
> DIR2BCKP[2]=«&nbsp;opt&nbsp;»  
> DIR2BCKP[3]=«&nbsp;root&nbsp;»  
> DIR2BCKP[4]=«&nbsp;var&nbsp;»
> 
> declare -i NB\_ARCHIVES=7  
> declare -i count=${#DIR2BCKP[@]}  
> declare -i i=0  
> declare -i x=$(expr $NB\_ARCHIVES - 1)

Ça bogue sur les ‹&nbsp;declare&nbsp;›, soit, donc que je les vire.  
Là, où j’ai un problème, c’est relativement à mon «&nbsp;tableau&nbsp;» DIR2BCKP.

Si je l’écris ainsi:

```auto
DIR2BCKP=(etc home opt var root)
```

J’ai le droit à cette erreur /root/rotate\_backup: 19: Syntax error: «&nbsp;(&nbsp;» unexpected  
De fait, je ne vois pas comment gérer !

Une idée, svp ?! 😒

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/2 "2016-02-21T00:44:23Z")

</div>

Bon, apparemment la déclaration n’est plus un acte nécessaire !

Si je lis [tldp.org/LDP/abs/html/arrays.html](http://tldp.org/LDP/abs/html/arrays.html), ma construction de tableau est bonne.  
Je ne comprends plus!

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/3 "2016-02-21T00:44:33Z")

</div>

Tu n’as pas un problème de tags de script, au début ?

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/4 "2016-02-21T00:44:37Z")

</div>

Salut,

Ceci devrait faire l’affaire :

```auto
#!/bin/bash
#
# Modifié le 26.01.2011 à 10:48
#
# this script is linked with script sauvegarde_rsync_module2

declare -a DIR2CIFS=( "/mnt/smb/FreeNAS/srvr-crocolion" ) 
declare -a RSYNC_OPTIONS=( "-avcRHKz" "--delete-during" "--delete-excluded" "--ignore-errors" "--force" "--numeric-ids" "--partial" "--stats" "--timeout=900" )
declare -a DIR2BCKP=()

declare mount="/bin/mount"
declare umount="/bin/umount -l"

DIR2BCKP[0]="etc"
DIR2BCKP[1]="home"
DIR2BCKP[2]="opt"
DIR2BCKP[3]="root"
DIR2BCKP[4]="var"

declare -i NB_ARCHIVES=7
declare -i count=${#DIR2BCKP[@]}
declare -i i=0
declare -i x=$(($NB_ARCHIVES - 1))
```

note : pas besoin de déclarer mount et umount en tant que tableau

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/5 "2016-02-21T00:44:45Z")

</div>

Merci à tous les deux.

En fait, j’ai trouvé le problème - dû à une incompréhension et non pas à une erreur de script.

L’incompréhension était que dans le fait, malgré avoir le shebang bash, malgré le shell user à bash, je lançais mon script par ‘sh script’.  
Comme le shell d’exécution est maintenant dash, le shell ne comprenait peu ou prou à mon script.  
De l’impératif de le lancer, soit par ./script, soit par son chemin absolu, afin que ce soit bash qui l’exécute !!!

Une personne m’a aidé gentiment à comprendre mon erreur de raisonnement !  
(et, dire que j’ai ramé toute la journée, à ne rien comprendre, pourquoi la melasse … tsss)

Voili, voilou … je vais cloturer le post - en espérant que cela serve à d’autres 😉

PS : Du coup, cela peut être intéressant d’inclure ce bout de code, dans les scripts bash - ça sert pour les têtes de linottes ; et, ça m’arrive 😉

```auto
#!/bin/bash
#
cmd=`ls -l /bin/sh | awk '{print $NF}'` 

if ["$cmd" != "bash"]; then
    echo "Hey ... the shell is $cmd - "
    echo "It's appear you run the script by 'sh $0' and not by './$0'!"
    echo "Please, run-it correctly - Bye!"
    exit
fi
```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/6 "2016-02-21T00:44:47Z")

</div>

Non ça ne sert à rien tu as mis le sheban `#!/bin/bash` donc quand tu lance ton script par `./ton_script.sh` tu est sûr que c’est bash qui l’exécute.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/7 "2016-02-21T00:44:48Z")

</div>

> [@MisterFreez](#):
>
> Non ça ne sert à rien tu as mis le sheban `#!/bin/bash` (…).

Beh, justement, … cela sert pour justement les cas où tu - ou une autre personne, lances le script par ‹&nbsp;sh script&nbsp;› !  
Ca te rappelle à l’ordre, sans exécuter la suite !

(Vieille habitude que j’avais de faire ainsi, pour tester mes scripts bash … et, je dois pas être le seul ; cela serait étonnant ![:whistle:](https://www.debian-fr.org/uploads/default/original/1X/899b2c331f8cc02517f77948602974610a95f952.gif "Whistle") )

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/8 "2016-02-21T00:44:48Z")

</div>

[quote=«&nbsp;PengouinPdt&nbsp;»]Beh, justement, … cela sert pour justement les cas où tu - ou une autre personne, lances le script par ‹&nbsp;sh script&nbsp;› !  
Ca te rappelle à l’ordre, sans exécuter la suite !

(Vieille habitude que j’avais de faire ainsi, pour tester mes scripts bash … et, je dois pas être le seul ; cela serait étonnant ![:whistle:](https://www.debian-fr.org/uploads/default/original/1X/899b2c331f8cc02517f77948602974610a95f952.gif "Whistle") )[/quote]  
Je vois pas l’interêt d’exécuter avec `sh script.sh` ![:017](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit")

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 12:44 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/9 "2016-02-21T00:44:48Z")

</div>

> [@MisterFreez](#):
>
> Je vois pas l’interêt d’exécuter avec `sh script.sh` ![:017](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit")

Soit … mais, t’inquiétes, d’autres le verront … surtout en phase de test, et quand tu veux faire le gros fainéant, rapport à un chmod +x (par exemple). ![:ugeek:](https://www.debian-fr.org/uploads/default/original/1X/60aa0bc609d6c1cf1242a151e9c1410e4f9e6e44.gif "geek")

Sans oublier qu’il ne faut jamais présumer des utilisateurs, et qu’ils l’utiliseront absolument comme tu sembles le prévoir.

C’est un peu comme rajouter la détection de l’id pour s’assurer que tel script est lancé en tant que root, et tel autre, non !

---

<div class="post-metadata">

**Author:** ![csmik](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/858c86/32.png) [@csmik](https://www.debian-fr.org/u/csmik)\
**Post date:** [Février 21, 2016, 12:51 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/10 "2016-02-21T00:51:41Z")

</div>

Juste pour info, quand tu faisais sh [tonscript.sh](http://tonscript.sh) en fait c’etait sh qui le lancait et pas bash.

Cela fonctionnait car le scripting bash est derive de sh, et utilise la meme base (de souvenirs c’est ca, dans les details je me trompe peut etre).

Dash remplace sh.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 12:51 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/11 "2016-02-21T00:51:52Z")

</div>

[quote=“csmik”]Juste pour info, quand tu faisais sh [tonscript.sh](http://tonscript.sh) en fait c’etait sh qui le lancait et pas bash.

Cela fonctionnait car le scripting bash est derive de sh, et utilise la meme base (de souvenirs c’est ca, dans les details je me trompe peut etre).

Dash remplace sh.[/quote]

Oui, ça, j’ai fini par le comprendre…  
Et, ce n’est pas exactement cela ; c’est plutôt ‘sh’ (alias ‘shell’) pointe vers Dash au lieu de Bash.  
Et, comme tu dis, avant cela fonctionnait correctement, puisqu’en faisant ‘sh script’, c’était Bash qui était appellé - certainement, cela impliquait un mauvais comportement humain - maintenant, tout le monde l’a compris, ‘sh script’ appelle Dash - ce qui créé les erreurs relatives…

Bref, la leçon de cette histoire : bien typer, par le shebang adhoc - ce que je faisais depuis le début -, ses fichiers scripts et les exécuter correctement, par l’appel système correspondant …

---

<div class="post-metadata">

**Author:** ![csmik](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/858c86/32.png) [@csmik](https://www.debian-fr.org/u/csmik)\
**Post date:** [Février 21, 2016, 12:51 UTC](https://www.debian-fr.org/t/bash-ou-dash-attention-au-shell-executant-les-scripts/30546/12 "2016-02-21T00:51:52Z")

</div>

Euh non, sh ne pointait pas vers bash. Sh, c etait sh, le shell par default, le truc ultra leger hyper minimaliste de base que personne (du moins j espere) n’utilise.  
Peut servir pour faire des scripts generiques, ou… benh je sais pas trop en fait!!  
Dash est une (tres) legere amelioration de sh (je n ai pas lu le code, mais pour avoir deja recode un sh++, je n ai pas vu de grandes ameliorations avec dash, mis a part une base plus proche de tcsh que de bash (sh) ).

Edit: en fait non, dash ressemble plus a bash qu a tcsh ^^
