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

Bonjour,

Je viens de mettre à jour, y’a deux jours, mon serveur Debian - stable - qui est donc passé de Lenny à Squeeze, tout naturellement :stuck_out_tongue: (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 :

Ça bogue sur les ‘declare’, soit, donc que je les vire.
Là, où j’ai un problème, c’est relativement à mon “tableau” DIR2BCKP.

Si je l’écris ainsi:

DIR2BCKP=(etc home opt var root)

J’ai le droit à cette erreur /root/rotate_backup: 19: Syntax error: “(” unexpected
De fait, je ne vois pas comment gérer !

Une idée, svp ?! :unamused:

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

Si je lis tldp.org/LDP/abs/html/arrays.html, ma construction de tableau est bonne.
Je ne comprends plus!

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

Salut,

Ceci devrait faire l’affaire :

#!/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

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 :wink:

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 :wink:

#!/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

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.

Beh, justement, … cela sert pour justement les cas où tu - ou une autre personne, lances le script par ‘sh script’ !
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: )

[quote=“PengouinPdt”]Beh, justement, … cela sert pour justement les cas où tu - ou une autre personne, lances le script par ‘sh script’ !
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: )[/quote]
Je vois pas l’interêt d’exécuter avec sh script.sh :017

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:

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 !

Juste pour info, quand tu faisais sh 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=“csmik”]Juste pour info, quand tu faisais sh 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 …

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 ^^