{"id":70,"date":"2012-01-10T20:29:36","date_gmt":"2012-01-10T19:29:36","guid":{"rendered":"http:\/\/www.enricosaviano.it\/blog\/?p=70"},"modified":"2012-01-10T20:29:36","modified_gmt":"2012-01-10T19:29:36","slug":"debuggare-uno-script-bash","status":"publish","type":"post","link":"https:\/\/www.enricosaviano.it\/blog\/2012\/01\/10\/debuggare-uno-script-bash\/","title":{"rendered":"Debuggare uno script bash"},"content":{"rendered":"<p>Quando uno script in bash cresce in dimensioni, diventa sempre pi\u00f9 difficile <strong>trovare eventuali errori nel codice<\/strong>.<\/p>\n<p>La shell <strong>GNU bash<\/strong> fornisce a questo scopo alcune <strong>funzionalit\u00e0 di debug<\/strong>.<\/p>\n<p>La pi\u00f9 immediata ed interessante \u00e8 la &#8220;<strong>modalit\u00e0 debug<\/strong>&#8220;, che si attiva eseguendo la sotto-shell con l&#8217;<strong>opzione -x<\/strong>; in questa modalit\u00e0 ogni comando pi\u00f9 ogni suo argomento \u00e8 stampato sullo standard output dopo che le variabili sono state sostituite, ma prima di essere eseguito, ad esempio: <span id=\"more-86\"><\/span><\/p>\n<blockquote>\n<pre>~$ cat script.sh\r\n#!\/bin\/bash\r\nVARTEST=\"variabile di test\"\r\necho \"$VARTEST\"\r\necho \"\"\r\n~$ bash -x script.sh\r\n+ VARTEST='variabile di test'\r\n+ echo 'variabile di test'\r\nvariabile di test\r\n+ echo ''\r\n\r\n~$<\/pre>\n<\/blockquote>\n<p>Si pu\u00f2 <strong>attivare la modalit\u00e0<\/strong> di debug anche solo <strong>in un pezzo del codice<\/strong>, in questo modo:<\/p>\n<blockquote>\n<pre>~$ cat script.sh\r\n#!\/bin\/bash\r\nVARTEST=\"variabile di test\"\r\nset -x\r\necho \"$VARTEST\"\r\nset +x\r\necho \"\"\r\n~$ bash script.sh\r\n+ echo 'variabile di test'\r\nvariabile di test\r\n+ set +x\r\n~$<\/pre>\n<\/blockquote>\n<p>E&#8217; possibile passare dalla modalit\u00e0 debug alla modalit\u00e0 normale quante volte si vuole all&#8217;interno di uno script.<\/p>\n<p>Altro strumento utile \u00e8 la &#8220;<strong>modalit\u00e0 di non-esecuzione<\/strong>&#8220;; in questa modalit\u00e0 la sintassi viene analizzata in cerca di errori, senza per\u00f2 eseguire i comandi dello script. La modalit\u00e0 \u00e8 attivabile attraverso l&#8217;<strong>opzione -n<\/strong>, sia per tutto lo script che per una sua parte soltanto, in maniera analoga all&#8217;opzione precedente:<\/p>\n<blockquote>\n<pre>~$ cat script.sh\r\n#!\/bin\/bash\r\necho \"inizio test\"\r\nNUM=2\r\necho \"numero = $NUM\"\r\nif [[ 1 -lt $NUM ]]\r\nthen\r\n echo $NUM maggiore di 1\r\n~$ bash -n script.sh\r\nscript.sh: riga 8: errore di sintassi: fine di file non attesa\r\n~$<\/pre>\n<\/blockquote>\n<p>Applicato su una porzione di codice:<\/p>\n<blockquote>\n<pre>~$ cat script.sh\r\n#!\/bin\/bash\r\necho \"inizio test\"\r\nset -n\r\nNUM=2\r\necho \"numero = $NUM\"\r\nif [[ 1 -lt $NUM ]]\r\nthen\r\n echo $NUM maggiore di 1\r\nset +n\r\n~$ bash script.sh\r\ninizio test\r\nscript.sh: riga 10: errore di sintassi: fine di file non attesa\r\n~$<\/pre>\n<\/blockquote>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Quando uno script in bash cresce in dimensioni, diventa sempre pi\u00f9 difficile trovare eventuali errori nel codice. La shell GNU bash fornisce a questo scopo alcune funzionalit\u00e0 di debug. La pi\u00f9 immediata ed interessante \u00e8 la &#8220;modalit\u00e0 debug&#8220;, che si attiva eseguendo la sotto-shell con l&#8217;opzione -x; in questa modalit\u00e0 ogni comando pi\u00f9 ogni suo [&hellip;]<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[11,3,10,12,30],"_links":{"self":[{"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/posts\/70"}],"collection":[{"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/comments?post=70"}],"version-history":[{"count":1,"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/posts\/70\/revisions"}],"predecessor-version":[{"id":71,"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/posts\/70\/revisions\/71"}],"wp:attachment":[{"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/media?parent=70"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/categories?post=70"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.enricosaviano.it\/blog\/wp-json\/wp\/v2\/tags?post=70"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}