{"id":694,"date":"2009-10-24T11:47:02","date_gmt":"2009-10-24T09:47:02","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=694"},"modified":"2009-10-24T11:47:02","modified_gmt":"2009-10-24T09:47:02","slug":"debugger-un-script-shell","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2009\/10\/debugger-un-script-shell\/","title":{"rendered":"D\u00e9bugger un script shell"},"content":{"rendered":"<p>Plus un programme ou un script devient complexe et plus il devient important d&rsquo;avoir des outils pour pouvoir le d\u00e9bugger. On connait <em>gdb<\/em>, le d\u00e9buggeur de <em>gcc<\/em> qui avec des commandes simples permet de d\u00e9bugger un programme. Mais <em>gdb<\/em> n&rsquo;est pas utilisable avec vos scripts shell. Malheureusement il n&rsquo;existe pas nativement de d\u00e9buggeur pour scripts shell. La seule possibilit\u00e9 que vous ayez est d&rsquo;utiliser les maigres possibilit\u00e9s de bash pour tracer vos programmes.<\/p>\n<p>La premi\u00e8re chose que vous pouvez faire est de tester votre script pour trouver toutes les erreurs de syntaxe que vous avez pu faire en tapant le code. Il est possible de demander \u00e0 <em>bash<\/em> de vous les donner sans que le script ne soit ex\u00e9cut\u00e9. Il suffit pour cela de lancer le script avec l&rsquo;option <em>-n<\/em> de <em>bash<\/em>. Par exemple vous avez tap\u00e9 dans votre \u00e9diteur de texte favori le script suivant:<\/p>\n<pre class=\"codesource\">\r\n#!\/bin\/bash\r\n\r\nfor i in *\r\ndu\r\n  file \"$i\"\r\ndone\r\n<\/pre>\n<p>Si vous regardez ce petit script de pr\u00e8s, vous vous apercevrez que j&rsquo;ai tap\u00e9 <em>du<\/em> au lieu de <em>do<\/em>. Si vous lancez le script avec l&rsquo;option <em>-n<\/em>, voici ce qui s&rsquo;affichera dans le terminal:<\/p>\n<pre class=\"codesource\">\r\n$ bash -n script.sh\r\n\/home\/michel\/bin\/script.sh: script.sh: line 4: Erreur de syntaxe pr\u00e8s du symbole inattendu \u00ab du \u00bb\r\n\/home\/michel\/bin\/script.sh: script.sh: line 4: `du'\r\n<\/pre>\n<p>Par contre si vous faites une erreur dans la commande <em>file<\/em> et que vous \u00e9crivez <em>fole<\/em> \u00e0 la place, <em>bash<\/em> ne vous dira rien car c&rsquo;est une commande externe \u00e0 <em>bash<\/em> et non pas un mot cl\u00e9 du langage de script.<br \/>\nIl n&rsquo; y a pas que les fautes de frappe qui sont d\u00e9tect\u00e9es par cette option; les vraies erreurs de syntaxe aussi \u00e9videmment. Par exemple si vous construisez votre boucle <em>for<\/em> comme en python:<\/p>\n<pre class=\"codesource\">\r\n#!\/bin\/bash\r\n\r\nfor i in *:\r\n  file \"$i\"\r\n<\/pre>\n<p>Voici le r\u00e9sultat affich\u00e9 dans la console:<\/p>\n<pre class=\"codesource\">\r\n$ bash -n script.sh\r\n\/home\/michel\/bin\/script.sh: script.sh: line 4: Erreur de syntaxe pr\u00e8s du symbole inattendu \u00ab file \u00bb\r\n\/home\/michel\/bin\/script.sh: script.sh: line 4: `  file \"$i\"'\r\n<\/pre>\n<p>Pour vous aider dans la mise au point de votre script, vous pouvez aussi utiliser l&rsquo;option <em>-x<\/em> qui affiche la commande et ses arguments au moment de l&rsquo;ex\u00e9cution de celle-ci. Reprenons notre script et lan\u00e7ons le avec l&rsquo;option <em>-x<\/em>:<\/p>\n<pre class=\"codesource\">\r\n#!\/bin\/bash\r\n\r\nfor i in *\r\ndo\r\n  file \"$i\"\r\ndone\r\n\r\n$ bash -x script.sh\r\n+ for i in '*'\r\n+ file file1.zip\r\nfile1.zip: Zip archive data, at least v2.0 to extract\r\n+ for i in '*'\r\n+ file image.PNG\r\nimage.PNG: PNG image, 360 x 280, 8-bit\/color RGBA, non-interlaced\r\n+ for i in '*'\r\n+ file texte.odt\r\ntexte.odt: OpenDocument Text\r\n+ for i in '*'\r\n+ file 'backup'\r\nbackup: directory\r\n...\r\n<\/pre>\n<p>On voit clairement ici que, \u00e0 chaque \u00e9tape dans la boucle <em>for<\/em>, la commande est affich\u00e9e ainsi que le r\u00e9sultat de celle-ci. Ca permet de tracer le d\u00e9roulement du programme et voir si, s\u00e9quentiellement, celui-ci est correct. On peut \u00e9videmment ajouter des <em>echo<\/em> partout o\u00f9 la valeur d&rsquo;une variable permet de contr\u00f4ler le flux d&rsquo;ex\u00e9cution du programme.<\/p>\n<p>Cette option <em>-x<\/em> peut \u00eatre introduite directement dans le code source du script et ne doit pas n\u00e9cessairement \u00eatre introduit dans la ligne de commande:<\/p>\n<pre class=\"codesource\">\r\n#!\/bin\/bash -x\r\n\r\nfor i in *\r\ndo\r\n  file \"$i\"\r\ndone\r\n<\/pre>\n<p>est \u00e9quivalent lors de l&rsquo;ex\u00e9cution \u00e0:<\/p>\n<pre class=\"codesource\">\r\n$ bash -x script.sh\r\n<\/pre>\n<p>De m\u00eame, cette option peut \u00eatre mise \u00e0 <em>on<\/em> ou \u00e0 <em>off<\/em> \u00e0 l&rsquo;int\u00e9rieur m\u00eame du script dans le cas o\u00f9 vous ne d\u00e9siriez pas que bash vous affiche toutes les commandes et le r\u00e9sultat de celles-ci mais seulement d&rsquo;une petite partie de votre script:<\/p>\n<pre class=\"codesource\">\r\n#!\/bin\/bash\r\n\r\nset -x    #on\r\n\r\nfor i in *\r\ndo\r\n  file \"$i\"\r\ndone\r\n\r\nset +x    #off\r\n<\/pre>\n<p><em>set -x<\/em> met \u00e0 <em>on<\/em> l&rsquo;affichage des commandes et <em>set +x<\/em> le met \u00e0 <em>off<\/em>. <\/p>\n<p>Il y a aussi la solution que vous \u00e9criviez vous-m\u00eame une fonction plus ou moins intelligente pour vous aidez dans la recherche des erreurs dans vos scripts.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Plus un programme ou un script devient complexe et plus il devient important d&rsquo;avoir des outils pour pouvoir le d\u00e9bugger. On connait gdb, le d\u00e9buggeur de gcc qui avec des commandes simples permet de d\u00e9bugger un programme. Mais gdb n&rsquo;est pas utilisable avec vos scripts shell. Malheureusement il n&rsquo;existe pas nativement de d\u00e9buggeur pour scripts [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/694"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=694"}],"version-history":[{"count":5,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/694\/revisions"}],"predecessor-version":[{"id":699,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/694\/revisions\/699"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}