Il existe un débogueur bash, bashdb , qui est un paquet installable sur de nombreuses distributions. Il utilise le mode de débogage étendu intégré de bash ( shopt -s extdebug
). Cela ressemble beaucoup à gdb; voici un exemple de session pour donner un peu de saveur:
$ ls
1st.JPG 2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
newf=${f/JPG/jpg}
mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1: for f in *.JPG
bashdb<0> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4: mv $f $newf
Comme dans gdb, l'instruction est affichée juste avant son exécution. Nous pouvons donc examiner les variables pour voir ce que l’instruction fera avant de le faire.
bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1: for f in *.JPG
bashdb<4> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4: mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG
Ce n'est pas ce que nous voulons! Regardons à nouveau l'expansion des paramètres.
bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg
OK, ça marche. Réglons newf
la valeur correcte.
bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg
Cela semble bon. Continuez le script.
bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg 2ndJPG.jpg