Your IP : 216.73.216.81


Current Path : /proc/695564/root/usr/share/debian-reference/
Upload File :
Current File : //proc/695564/root/usr/share/debian-reference/ch12.it.html

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Capitolo 12. Programmazione</title>
    <link rel="stylesheet" type="text/css" href="debian-reference.css"/>
    <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot"/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <link rel="home" href="index.it.html" title="Debian Reference"/>
    <link rel="up" href="index.it.html" title="Debian Reference"/>
    <link rel="prev" href="ch11.it.html" title="Capitolo 11. Conversione di dati"/>
    <link rel="next" href="apa.it.html" title="Appendice A. Appendice"/>
  </head>
  <body>
    <div class="navheader">
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Capitolo 12. Programmazione</th>
        </tr>
        <tr>
          <td align="left"><a accesskey="p" href="ch11.it.html"><img src="images/prev.png" alt="Indietro"/></a> </td>
          <th width="60%" align="center"> </th>
          <td align="right"> <a accesskey="n" href="apa.it.html"><img src="images/next.png" alt="Avanti"/></a></td>
        </tr>
      </table>
      <hr/>
    </div>
    <div class="chapter">
      <div class="titlepage">
        <div>
          <div>
            <h1 class="title"><a id="_programming"/>Capitolo 12. Programmazione</h1>
          </div>
        </div>
      </div>
      <div class="toc">
        <p>
          <strong>Indice</strong>
        </p>
        <dl class="toc">
          <dt>
            <span class="section">
              <a href="ch12.it.html#_the_shell_script">12.1. Script shell</a>
            </span>
          </dt>
          <dd>
            <dl>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_posix_shell_compatibility">12.1.1. Compatibilità con la shell POSIX</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_shell_parameters">12.1.2. Parametri di shell</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_shell_conditionals">12.1.3. Costrutti condizionali della shell</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_shell_loops">12.1.4. Cicli di shell</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_shell_environment_variables">12.1.5. Variabile d'ambiente della shell</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_the_shell_command_line_processing_sequence">12.1.6. La sequenza di elaborazione della riga di comando di shell</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_utility_programs_for_shell_script">12.1.7. Programmi di utilità per script di shell</a>
                </span>
              </dt>
            </dl>
          </dd>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_scripting_in_interpreted_languages">12.2. Creazione di script in linguaggi interpretati</a>
            </span>
          </dt>
          <dd>
            <dl>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_debugging_interpreter_codes">12.2.1. Fare il debug di codice di linguaggi interpretati</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_gui_program_with_the_shell_script">12.2.2. Programma GUI con script di shell</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_custom_actions_for_gui_filer">12.2.3. Azioni personalizzate per un gestore di file con GUI</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_perl_short_script_madness">12.2.4. Pazzie con corti script Perl</a>
                </span>
              </dt>
            </dl>
          </dd>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_coding_in_compiled_languages">12.3. Scrivere codice in linguaggi compilati</a>
            </span>
          </dt>
          <dd>
            <dl>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_c">12.3.1. C</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_simple_c_program_gcc">12.3.2. Semplice programma in C (gcc)</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_flex_a_better_lex">12.3.3. Flex - un Lex migliorato</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_bison_a_better_yacc">12.3.4. Bison - Yacc migliorato</a>
                </span>
              </dt>
            </dl>
          </dd>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_static_code_analysis_tools">12.4. Strumenti di analisi statica del codice </a>
            </span>
          </dt>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_debug">12.5. Debug</a>
            </span>
          </dt>
          <dd>
            <dl>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_basic_gdb_execution">12.5.1. Esecuzione base di gdb</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_debugging_the_debian_package">12.5.2. Fare il debug di pacchetti Debian</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_obtaining_backtrace">12.5.3. Ottenere un backtrace</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_advanced_gdb_commands">12.5.4. Comandi gdb avanzati</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_check_dependency_on_libraries">12.5.5. Controllare le dipendenze dalle librerie</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_dynamic_call_tracing_tools">12.5.6. Strumenti per tracciamento di chiamate dinamiche</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_debugging_x_errors">12.5.7. Fare il debug di errori X</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_memory_leak_detection_tools">12.5.8. Strumenti per rilevazione di memory leak</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_disassemble_binary">12.5.9. Disassemblatore di binari</a>
                </span>
              </dt>
            </dl>
          </dd>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_build_tools">12.6. Strumenti di compilazione</a>
            </span>
          </dt>
          <dd>
            <dl>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_make">12.6.1. Make</a>
                </span>
              </dt>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_autotools">12.6.2. Autotools</a>
                </span>
              </dt>
              <dd>
                <dl>
                  <dt>
                    <span class="section">
                      <a href="ch12.it.html#_compile_and_install_a_program">12.6.2.1. Compilare ed installare un programma</a>
                    </span>
                  </dt>
                  <dt>
                    <span class="section">
                      <a href="ch12.it.html#_uninstall_program">12.6.2.2. Disinstallare un programma</a>
                    </span>
                  </dt>
                </dl>
              </dd>
              <dt>
                <span class="section">
                  <a href="ch12.it.html#_meson">12.6.3. Meson</a>
                </span>
              </dt>
            </dl>
          </dd>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_web">12.7. Web</a>
            </span>
          </dt>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_the_source_code_translation">12.8. Traduzione di codice sorgente</a>
            </span>
          </dt>
          <dt>
            <span class="section">
              <a href="ch12.it.html#_making_debian_package">12.9. Creare pacchetti Debian</a>
            </span>
          </dt>
        </dl>
      </div>
      <p>Vengono forniti in questo capitolo alcune informazioni base da cui partire
per imparare a programmare su un sistema Debian abbastanza da seguire il
codice sorgente impacchettato. Quello che segue è un elenco dei pacchetti
importanti per la programmazione e dei corrispettivi pacchetti di
documentazione.</p>
      <p>Guide di riferimento in linea sono disponibili digitando "<code class="literal">man
nome</code>" dopo aver installato i pacchetti <code class="literal">manpages</code>
e <code class="literal">manpages-dev</code>. Le guide di riferimento in linea per gli
strumenti GNU sono disponibili digitando "<code class="literal">info
nome_programma</code>", dopo aver installato i pertinenti pacchetti di
documentazione. Può essere necessario includere gli archivi
"<code class="literal">contrib</code> e <code class="literal">non-free</code>, oltre
all'archivio <code class="literal">main</code>, dato che alcune documentazioni GFDL
non sono considerate conformi alle DFSG.</p>
      <p>Considerare l'uso degli strumenti dei sistemi di controllo di
versione. Vedere <a class="xref" href="ch10.it.html#_git" title="10.5. Git">Sezione 10.5, «Git»</a>. </p>
      <div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
        <table border="0" summary="Warning">
          <tr>
            <td rowspan="2" align="center" valign="top">
              <img alt="[Avvertimento]" src="images/warning.png"/>
            </td>
            <th align="left">Avvertimento</th>
          </tr>
          <tr>
            <td align="left" valign="top">
              <p>Non usare "<code class="literal">test</code>" come nome di un file di prova
eseguibile. "<code class="literal">test</code>" è un comando interno della shell.</p>
            </td>
          </tr>
        </table>
      </div>
      <div class="caution" style="margin-left: 0.5in; margin-right: 0.5in;">
        <table border="0" summary="Caution">
          <tr>
            <td rowspan="2" align="center" valign="top">
              <img alt="[Attenzione]" src="images/caution.png"/>
            </td>
            <th align="left">Attenzione</th>
          </tr>
          <tr>
            <td align="left" valign="top">
              <p>I programmi software compilati direttamente dai sorgenti andrebbero
installati in "<code class="literal">/usr/local</code>" o "<code class="literal">/opt</code>"
per evitare conflitti.</p>
            </td>
          </tr>
        </table>
      </div>
      <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
        <table border="0" summary="Tip">
          <tr>
            <td rowspan="2" align="center" valign="top">
              <img alt="[Suggerimento]" src="images/tip.png"/>
            </td>
            <th align="left">Suggerimento</th>
          </tr>
          <tr>
            <td align="left" valign="top">
              <p><a class="ulink" href="http://www.99-bottles-of-beer.net/">Esempi di codice per creare
la "Canzone 99 bottiglie di birra"</a> dovrebbe dare buone idee per
praticamente tutti i linguaggi di programmazione.</p>
            </td>
          </tr>
        </table>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_the_shell_script"/>12.1. Script shell</h2>
            </div>
          </div>
        </div>
        <p>Uno <a class="ulink" href="https://en.wikipedia.org/wiki/Shell_script">script di shell</a> è un file di testo
con il bit di esecuzione impostato e contiene i comandi nel formato
seguente.</p>
        <pre class="screen">#!/bin/sh
 ... command lines</pre>
        <p>La prima riga specifica l'interprete di shell che legge ed esegue il
contenuto di questo file.</p>
        <p>Leggere script di shell è il modo <span class="strong"><strong>migliore</strong></span> per capire come funzioni un sistema
*nix. In questa sezione vengono forniti alcune nozioni di riferimento e
promemoria per la programmazione di shell. Vedere "Errori in shell" (<a class="ulink" href="http://www.greenend.org.uk/rjk/2001/04/shell.html">http://www.greenend.org.uk/rjk/2001/04/shell.html</a>)
per imparare dagli errori.</p>
        <p>A differenza della modalità interattiva della shell (vedere <a class="xref" href="ch01.it.html#_the_simple_shell_command" title="1.5. Il semplice comando di shell">Sezione 1.5, «Il semplice comando di shell»</a> e <a class="xref" href="ch01.it.html#_unix_like_text_processing" title="1.6. Elaborazione di testo stile Unix">Sezione 1.6, «Elaborazione di testo stile Unix»</a>), gli script di shell usano spesso
parametri, costrutti condizionali e cicli.</p>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_posix_shell_compatibility"/>12.1.1. Compatibilità con la shell POSIX</h3>
              </div>
            </div>
          </div>
          <p>Molti script di sistema possono essere interpretati da una qualsiasi delle
shell <a class="ulink" href="https://it.wikipedia.org/wiki/POSIX">POSIX</a> (vedere <a class="xref" href="ch01.it.html#list-of-shell-programs" title="Tabella 1.13. Elenco di programmi shell">Tabella 1.13, «Elenco di programmi shell»</a>).</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p>La shell POSIX non interattiva predefinita "<code class="literal">/bin/sh</code>" è un
collegamento simbolico che punta a <code class="literal">/usr/bin/dash</code> ed è
usata da molti programmi di sistema. </p>
              </li>
              <li class="listitem">
                <p>La shell POSIX interattiva predefinita è <code class="literal">/usr/bin/bash</code>. </p>
              </li>
            </ul>
          </div>
          <p>Evitare di scrivere uno script di shell con <span class="strong"><strong>bashismi</strong></span> o <span class="strong"><strong>zshismi</strong></span> per renderlo portabile tra tutte le shell
POSIX. Si può controllare uno script con
<code class="literal">checkbashisms</code>(1).</p>
          <div class="table">
            <a id="listoftypicalbashisms"/>
            <p class="title">
              <strong>Tabella 12.1. Elenco di bashismi tipici</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di bashismi tipici" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> Buono: POSIX </th>
                    <th style="text-align: left"> Da evitare: bashismo </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">if [ "$pippo" = "$pluto" ] ; then …</code> </td>
                    <td style="text-align: left"> <code class="literal">if [ "$pippo" == "$pluto" ] ; then …</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">diff -u file.c.orig file.c</code> </td>
                    <td style="text-align: left"> <code class="literal">diff -u file.c{.orig,}</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">mkdir /pippopluto /pippopaperino</code> </td>
                    <td style="text-align: left"> <code class="literal">mkdir /pippo{pluto,paperino}</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">nomefunzione() { … }</code> </td>
                    <td style="text-align: left"> <code class="literal">function nomefunzione() { … }</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> formato ottale: "<code class="literal">\377</code>" </td>
                    <td style="text-align: left"> formato esadecimale: "<code class="literal">\xff</code>" </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>Il comando "<code class="literal">echo</code>" deve essere usato con le precauzioni
seguenti dato che la sua implementazione è diversa negli svariati comandi
interni della shell ed esterni.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> Evitare l'uso di qualsiasi opzione di comando tranne
"<code class="literal">-n</code>".  </p>
              </li>
              <li class="listitem">
                <p> Evitare l'uso di sequenze di escape nelle stringhe dato che la loro gestione
è variabile.  </p>
              </li>
            </ul>
          </div>
          <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Note">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Nota]" src="images/note.png"/>
                </td>
                <th align="left">Nota</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Sebbene l'opzione "<code class="literal">-n</code>" <span class="strong"><strong>non</strong></span> faccia veramente parte della sintassi POSIX, è
generalmente accettata.</p>
                </td>
              </tr>
            </table>
          </div>
          <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Tip">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Suggerimento]" src="images/tip.png"/>
                </td>
                <th align="left">Suggerimento</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Se è necessario inserire sequenze di escape nella stringa in output, usare
il comando "<code class="literal">printf</code>" al posto del comando
"<code class="literal">echo</code>".</p>
                </td>
              </tr>
            </table>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_shell_parameters"/>12.1.2. Parametri di shell</h3>
              </div>
            </div>
          </div>
          <p>Negli script di shell vengono spesso usati parametri speciali.</p>
          <div class="table">
            <a id="listofshellparameters"/>
            <p class="title">
              <strong>Tabella 12.2. Elenco di parametri di shell</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di parametri di shell" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> parametro di shell </th>
                    <th style="text-align: left"> valore </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$0</code> </td>
                    <td style="text-align: left"> nome della shell o dello script di shell </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$1</code> </td>
                    <td style="text-align: left"> primo (1°) argomento di shell </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$9</code> </td>
                    <td style="text-align: left"> nono (9°) argomento di shell </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$#</code> </td>
                    <td style="text-align: left"> numero di parametri posizionali </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">"$*"</code> </td>
                    <td style="text-align: left"> <code class="literal">"$1 $2 $3 $4 … "</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">"$@"</code> </td>
                    <td style="text-align: left"> <code class="literal">"$1" "$2" "$3" "$4" …</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$?</code> </td>
                    <td style="text-align: left"> stato d'uscita del comando più recente </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$$</code> </td>
                    <td style="text-align: left"> PID dello script di shell </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$!</code> </td>
                    <td style="text-align: left"> PID del compito sullo sfondo avviato più recentemente </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>Le nozioni base da ricordare riguardanti la <span class="strong"><strong>espansione dei parametri</strong></span> sono le seguenti.</p>
          <div class="table">
            <a id="listofshellparameterexpansions"/>
            <p class="title">
              <strong>Tabella 12.3. Elenco di espansioni di parametri di shell</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di espansioni di parametri di shell" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> forma della espressione con parametri </th>
                    <th style="text-align: left"> valore se <code class="literal">var</code> è impostata </th>
                    <th style="text-align: left"> valore se <code class="literal">var</code> non è impostata </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var:-stringa}</code> </td>
                    <td style="text-align: left"> "<code class="literal">$var</code>" </td>
                    <td style="text-align: left"> "<code class="literal">stringa</code>" </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var:+stringa}</code> </td>
                    <td style="text-align: left"> "<code class="literal">stringa</code>" </td>
                    <td style="text-align: left"> "<code class="literal">null</code>" </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var:=stringa}</code> </td>
                    <td style="text-align: left"> "<code class="literal">$var</code>" </td>
                    <td style="text-align: left"> "<code class="literal">stringa</code>" (ed esegue "<code class="literal">var=stringa</code>") </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var:?string}</code> </td>
                    <td style="text-align: left"> "<code class="literal">$var</code>" </td>
                    <td style="text-align: left"> invia con echo "<code class="literal">stringa</code>" allo <span class="strong"><strong>stderr</strong></span> (ed esce con stato di errore) </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>I due punti "<code class="literal">:</code>" in tutti gli operatori nell'elenco
precedente sono di fatto opzionali.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p><span class="strong"><strong>con</strong></span> "<code class="literal">:</code>" l'operatore =
controlla che il suo operando <span class="strong"><strong>esista</strong></span> e
sia <span class="strong"><strong>non nullo</strong></span> </p>
              </li>
              <li class="listitem">
                <p><span class="strong"><strong>senza</strong></span> "<code class="literal">:</code>" l'operatore
= controlla solo che il suo operando <span class="strong"><strong>esista</strong></span> </p>
              </li>
            </ul>
          </div>
          <div class="table">
            <a id="listofkeyshellpatersubstitutions"/>
            <p class="title">
              <strong>Tabella 12.4. Elenco di sostituzioni chiave di parametri di shell</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di sostituzioni chiave di parametri di shell" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> forma della sostituzione di parametri </th>
                    <th style="text-align: left"> risultato </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var%suffisso}</code> </td>
                    <td style="text-align: left"> rimuove il più piccolo modello di suffisso </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var%%suffisso}</code> </td>
                    <td style="text-align: left"> rimuove il più grande modello di suffisso </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var#prefisso}</code> </td>
                    <td style="text-align: left"> rimuove il più piccolo modello di prefisso </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">${var##prefisso}</code> </td>
                    <td style="text-align: left"> rimuove il più grande modello di prefisso </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_shell_conditionals"/>12.1.3. Costrutti condizionali della shell</h3>
              </div>
            </div>
          </div>
          <p>Ogni comando restituisce uno <span class="strong"><strong>stato di
uscita</strong></span> che può essere usato in costrutti condizionali.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> Successo: 0 ("Vero") </p>
              </li>
              <li class="listitem">
                <p> Errore: non 0 ("Falso") </p>
              </li>
            </ul>
          </div>
          <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Note">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Nota]" src="images/note.png"/>
                </td>
                <th align="left">Nota</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>"0" nel contesto condizionale della shell significa "Vero", mentre "0" nel
contesto condizionale in C significa "Falso".</p>
                </td>
              </tr>
            </table>
          </div>
          <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Note">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Nota]" src="images/note.png"/>
                </td>
                <th align="left">Nota</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>"<code class="literal">[</code>" è l'equivalente del comando "<code class="literal">test</code>
che valuta i propri argomenti sino a "<code class="literal">]</code>" come
un'espressione condizionale.</p>
                </td>
              </tr>
            </table>
          </div>
          <p>Le <span class="strong"><strong>espressioni condizionali</strong></span> di base che è
bene ricordare sono le seguenti.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> "<code class="literal"><span class="emphasis"><em>comando</em></span> &amp;&amp;
<span class="emphasis"><em>se_successo_esegue_anche_questo_comando</em></span> ||
true</code>" </p>
              </li>
              <li class="listitem">
                <p> "<code class="literal"><span class="emphasis"><em>comando</em></span> ||
<span class="emphasis"><em>se_non_successo_esegue_anche_questo_comando</em></span> ||
true</code>" </p>
              </li>
              <li class="listitem">
                <p> Una porzione su più righe di script come la seguente </p>
              </li>
            </ul>
          </div>
          <pre class="screen">if [ <span class="emphasis"><em>conditional_expression</em></span> ]; then
 <span class="emphasis"><em>if_success_run_this_command</em></span>
else
 <span class="emphasis"><em>if_not_success_run_this_command</em></span>
fi</pre>
          <p>In questo caso il "<code class="literal">|| true</code>" finale era necessario per
assicurare che lo script non termini accidentalmente a tale riga quando la
shell è invocata con l'opzione "<code class="literal">-e</code>".</p>
          <div class="table">
            <a id="listoffilecompartionalexpression"/>
            <p class="title">
              <strong>Tabella 12.5. Elenco di operatori per paragonare file in espressioni condizionali</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di operatori per paragonare file in espressioni condizionali" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> equazione </th>
                    <th style="text-align: left"> condizione perché venga restituito il valore logico "vero" </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-e <span class="emphasis"><em>file</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file</em></span> esiste </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-d <span class="emphasis"><em>file</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file</em></span> esiste ed è una directory </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-f <span class="emphasis"><em>file</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file</em></span> esiste ed è un file regolare </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-w <span class="emphasis"><em>file</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file</em></span> esiste ed è scrivibile </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-x <span class="emphasis"><em>file</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file</em></span> esiste ed è eseguibile </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>file1</em></span> -nt <span class="emphasis"><em>file2</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file1</em></span> è più recente di <span class="emphasis"><em>file2</em></span> (data
di modifica) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>file1</em></span> -ot <span class="emphasis"><em>file2</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file1</em></span> è più vecchio di <span class="emphasis"><em>file2</em></span> (data
di modifica) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>file1</em></span> -ef <span class="emphasis"><em>file2</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>file1</em></span> e <span class="emphasis"><em>file2</em></span> sono sullo stesso
device e stesso numero inode </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <div class="table">
            <a id="listofstringcomptionalexpression"/>
            <p class="title">
              <strong>Tabella 12.6. Elenco di operatori per paragonare stringhe in espressioni condizionali</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di operatori per paragonare stringhe in espressioni condizionali" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> equazione </th>
                    <th style="text-align: left"> condizione perché venga restituito il valore logico "vero" </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-z <span class="emphasis"><em>str</em></span></code> </td>
                    <td style="text-align: left"> la lunghezza di <span class="emphasis"><em>str</em></span> è zero </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">-n <span class="emphasis"><em>str</em></span></code> </td>
                    <td style="text-align: left"> la lunghezza di <span class="emphasis"><em>str</em></span> è diversa da zero </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>str1</em></span> = <span class="emphasis"><em>str2</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>str1</em></span> e <span class="emphasis"><em>str2</em></span> sono uguali </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>str1</em></span> != <span class="emphasis"><em>str2</em></span></code> </td>
                    <td style="text-align: left"> <span class="emphasis"><em>str1</em></span> e <span class="emphasis"><em>str2</em></span> non sono uguali </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>str1</em></span> &lt; <span class="emphasis"><em>str2</em></span></code> </td>
                    <td style="text-align: left"> se ordinate, <span class="emphasis"><em>str1</em></span> viene prima di
<span class="emphasis"><em>str2</em></span> (dipendente dalla localizzazione) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal"><span class="emphasis"><em>str1</em></span> &gt; <span class="emphasis"><em>str2</em></span></code> </td>
                    <td style="text-align: left"> se ordinate, <span class="emphasis"><em>str1</em></span> viene dopo di
<span class="emphasis"><em>str2</em></span> (dipendente dalla localizzazione) </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>Gli operatori <span class="strong"><strong>aritmetici</strong></span> di comparazione
di interi nelle espressioni condizionali sono "<code class="literal">-eq</code>",
"<code class="literal">-ne</code>", "<code class="literal">-lt</code>",
"<code class="literal">-le</code>", "<code class="literal">-gt</code>" e
"<code class="literal">-ge</code>".</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_shell_loops"/>12.1.4. Cicli di shell</h3>
              </div>
            </div>
          </div>
          <p>Ci sono diverse espressioni per cicli usabili nella shell POSIX.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> "<code class="literal">for x in pippo1 pippo2 … ; do comando ; done</code>" ripete il
ciclo assegnando gli elementi nell'elenco "<code class="literal">pippo1 pippo2
…</code>" alla variabile "<code class="literal">x</code>" ed eseguendo
"<code class="literal">comando</code>".  </p>
              </li>
              <li class="listitem">
                <p> "<code class="literal">while condizione ; do comando ; done</code>" ripete
"<code class="literal">comando</code>" fintanto che "<code class="literal">condizione</code>" è
vera.  </p>
              </li>
              <li class="listitem">
                <p> "<code class="literal">until condizione ; do comando ; done</code>" ripete
"<code class="literal">comando</code>" fintanto che "<code class="literal">condition</code>" è
non vera.  </p>
              </li>
              <li class="listitem">
                <p> "<code class="literal">break</code>" permette di uscire dal ciclo.  </p>
              </li>
              <li class="listitem">
                <p> "<code class="literal">continue</code>" permette di riprendere dalla successiva
iterazione del ciclo.  </p>
              </li>
            </ul>
          </div>
          <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Tip">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Suggerimento]" src="images/tip.png"/>
                </td>
                <th align="left">Suggerimento</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>L'iterazione numerica in stile linguaggio <a class="ulink" href="https://it.wikipedia.org/wiki/C_(linguaggio)">C</a> può
essere realizzata usando <code class="literal">seq</code>(1) come "<code class="literal">pippo1
pippo2 …</code>"</p>
                </td>
              </tr>
            </table>
          </div>
          <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Tip">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Suggerimento]" src="images/tip.png"/>
                </td>
                <th align="left">Suggerimento</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Vedere <a class="xref" href="ch09.it.html#_repeating_a_command_looping_over_files" title="9.4.9. Ripetere un comando su diversi file">Sezione 9.4.9, «Ripetere un comando su diversi file»</a>.</p>
                </td>
              </tr>
            </table>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_shell_environment_variables"/>12.1.5. Variabile d'ambiente della shell</h3>
              </div>
            </div>
          </div>
          <p>Alcune popolari variabili d'ambiente per il normale prompt dei comandi della
shell possono non essere disponibili nell'ambiente di esecuzione di uno
script utente.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> Per "<code class="literal">$USER</code>", usare "<code class="literal">$(id -un)</code>"  </p>
              </li>
              <li class="listitem">
                <p> Per "<code class="literal">$UID</code>", usare "<code class="literal">$(id -u)</code>"  </p>
              </li>
              <li class="listitem">
                <p> Per "<code class="literal">$HOME</code>", usare "<code class="literal">$(getent passwd "$(id
-u)"|cut -d ":" -f 6)</code>" (questo funziona anche con <a class="xref" href="ch04.it.html#_the_modern_centralized_system_management" title="4.5.2. La moderna gestione centralizzata del sistema">Sezione 4.5.2, «La moderna gestione centralizzata del sistema»</a>) </p>
              </li>
            </ul>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_the_shell_command_line_processing_sequence"/>12.1.6. La sequenza di elaborazione della riga di comando di shell</h3>
              </div>
            </div>
          </div>
          <p>A grandi linee la shell elabora uno script nel modo seguente.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> La shell legge una riga.  </p>
              </li>
              <li class="listitem">
                <p> La shell raggruppa parte della riga come <span class="strong"><strong>un unico
elemento</strong></span> se è racchiusa in <code class="literal">"…"</code> o
<code class="literal">'…'</code>.  </p>
              </li>
              <li class="listitem">
                <p> La shell spezza le altre parti della riga in <span class="strong"><strong>elementi</strong></span> in base ai caratteri seguenti.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p> Spazi bianchi: <code class="literal"><span class="emphasis"><em>spazio</em></span>
<span class="emphasis"><em>tabulazione</em></span> &lt;a capo&gt;</code> </p>
                    </li>
                    <li class="listitem">
                      <p> Metacaratteri: <code class="literal"><span class="emphasis"><em> </em></span> | ; &amp; ( )</code> </p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell controlla, per ciascun elemento non racchiuso tra
<code class="literal">"…"</code> o <code class="literal">'…'</code>, la presenza di <span class="strong"><strong>parole riservate</strong></span> per regolare il proprio
comportamento.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p><span class="strong"><strong>Parole riservate</strong></span>: <code class="literal">if then elif
else fi for in while unless do done case esac</code></p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell espande gli <span class="strong"><strong>alias</strong></span> se non sono
racchiusi in <code class="literal">"…"</code> o <code class="literal">'…'</code>.  </p>
              </li>
              <li class="listitem">
                <p> La shell espande il carattere <span class="strong"><strong>tilde</strong></span> se
non è racchiuso in <code class="literal">"…"</code> o <code class="literal">'…'</code>.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p> "<code class="literal">~</code>" → directory home dell'utente attuale </p>
                    </li>
                    <li class="listitem">
                      <p> "<code class="literal">~<span class="emphasis"><em>utente</em></span></code>" → directory home di
<code class="literal"><span class="emphasis"><em>utente</em></span></code> </p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell espande <span class="strong"><strong>parametri</strong></span> nei loro
valori, se non sono racchiusi in <code class="literal">'…'</code>.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p><span class="strong"><strong>Parametro</strong></span>:
"<code class="literal">$PARAMETRO</code>" o "<code class="literal">${PARAMETRO}</code>" </p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell espande <span class="strong"><strong>sostituzioni di comandi</strong></span>,
se non sono racchiuse in <code class="literal">'…'</code>.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p> "<code class="literal">$( comando )</code>" → output di "<code class="literal">comando</code>" </p>
                    </li>
                    <li class="listitem">
                      <p> "<code class="literal">` command `</code>" → output di "<code class="literal">comando</code>" </p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell espande <span class="strong"><strong>glob di nomi percorso</strong></span>
nei nomi di file corrispondenti, se non sono racchiusi in
<code class="literal">"…"</code> o <code class="literal">'…'</code>.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p><code class="literal">*</code> → qualsiasi carattere </p>
                    </li>
                    <li class="listitem">
                      <p><code class="literal">?</code> → un carattere </p>
                    </li>
                    <li class="listitem">
                      <p><code class="literal">[…]</code> → uno qualunque dei caratteri in
"<code class="literal">…</code>" </p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell cerca <span class="strong"><strong>comando</strong></span> tra le cose
seguenti e lo esegue.  </p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p>Definizione di <span class="strong"><strong>funzione</strong></span> </p>
                    </li>
                    <li class="listitem">
                      <p>comando <span class="strong"><strong>interno</strong></span> </p>
                    </li>
                    <li class="listitem">
                      <p><span class="strong"><strong>file eseguibile</strong></span> in
"<code class="literal">$PATH</code>" </p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p> La shell si sposta alla riga seguente e ripete nuovamente questo processo
dall'inizio di questa sequenza.  </p>
              </li>
            </ul>
          </div>
          <p>Virgolette singole all'interno di virgolette doppie non hanno alcun effetto.</p>
          <p>L'esecuzione di "<code class="literal">set -x</code>" nella shell o l'invocazione
della shell con l'opzione "<code class="literal">-x</code>" fanno sì che la shell
stampi tutti i comandi eseguiti. Ciò è piuttosto utile per il debug.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_utility_programs_for_shell_script"/>12.1.7. Programmi di utilità per script di shell</h3>
              </div>
            </div>
          </div>
          <p>Per far sì che il proprio programma di shell sia il più portabile possibile
tra i sistemi Debian, è una buona idea limitare i programmi di utilità a
quelli forniti dai pacchetti <span class="strong"><strong>essenziali</strong></span>.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> "<code class="literal">aptitude search ~E</code>" elenca i pacchetti <span class="strong"><strong>essenziali</strong></span>.  </p>
              </li>
              <li class="listitem">
                <p> "<code class="literal">dpkg -L <span class="emphasis"><em>nome_pacchetto</em></span> |grep
'/man/man.*/'</code>" elenca le pagine man per i comandi forniti dal
pacchetto <code class="literal"><span class="emphasis"><em>nome_pacchetto</em></span></code>.  </p>
              </li>
            </ul>
          </div>
          <div class="table">
            <a id="listofpackagescosforshellscripts"/>
            <p class="title">
              <strong>Tabella 12.7. Elenco di pacchetti contenenti piccoli programmi di utilità per script di
shell</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di pacchetti contenenti piccoli programmi di utilità per script di&#10;shell" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> pacchetto </th>
                    <th style="text-align: left"> popcon </th>
                    <th style="text-align: left"> dimensione </th>
                    <th style="text-align: left"> descrizione </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/dash"> <code class="literal">dash</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=dash">V:894, I:995</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/d/dash.html">191</a>
                    </td>
                    <td style="text-align: left"> piccola e veloce shell conforme a POSIX per <code class="literal">sh</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/coreutils">
<code class="literal">coreutils</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=coreutils">V:908, I:999</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/c/coreutils.html">18062</a>
                    </td>
                    <td style="text-align: left"> Utilità GNU di base </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/grep"> <code class="literal">grep</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=grep">V:799, I:999</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/g/grep.html">1245</a>
                    </td>
                    <td style="text-align: left"> GNU <code class="literal">grep</code>, <code class="literal">egrep</code> e
<code class="literal">fgrep</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/sed"> <code class="literal">sed</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=sed">V:792, I:999</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/s/sed.html">987</a>
                    </td>
                    <td style="text-align: left"> GNU <code class="literal">sed</code> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/mawk"> <code class="literal">mawk</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=mawk">V:391, I:997</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/m/mawk.html">263</a>
                    </td>
                    <td style="text-align: left"> <code class="literal">awk</code> piccolo e veloce </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/debianutils">
<code class="literal">debianutils</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=debianutils">V:919, I:999</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/d/debianutils.html">243</a>
                    </td>
                    <td style="text-align: left"> utilità varie specifiche di Debian </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/bsdutils">
<code class="literal">bsdutils</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bsdutils">V:610, I:999</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/b/bsdutils.html">355</a>
                    </td>
                    <td style="text-align: left"> utilità di base per 4.4BSD-Lite </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/bsdextrautils">
<code class="literal">bsdextrautils</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bsdextrautils">V:454, I:548</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/b/bsdextrautils.html">337</a>
                    </td>
                    <td style="text-align: left"> utilità aggiuntive da 4.4BSD-Lite </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/moreutils">
<code class="literal">moreutils</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=moreutils">V:14, I:39</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/m/moreutils.html">244</a>
                    </td>
                    <td style="text-align: left"> utilità Unix aggiuntive </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Tip">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Suggerimento]" src="images/tip.png"/>
                </td>
                <th align="left">Suggerimento</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Sebbene <code class="literal">moreutils</code> possa non esistere al di fuori di
Debian, offre piccoli programmi interessanti. Quello più degno di nota è
<code class="literal">sponge</code>(8) che è piuttosto utile quando si desidera
sovrascrivere il file originale.</p>
                </td>
              </tr>
            </table>
          </div>
          <p>Vedere <a class="xref" href="ch01.it.html#_unix_like_text_processing" title="1.6. Elaborazione di testo stile Unix">Sezione 1.6, «Elaborazione di testo stile Unix»</a> per esempi.</p>
        </div>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_scripting_in_interpreted_languages"/>12.2. Creazione di script in linguaggi interpretati</h2>
            </div>
          </div>
        </div>
        <div class="table">
          <a id="listofinterpreterrelatedpackages"/>
          <p class="title">
            <strong>Tabella 12.8. Elenco di pacchetti relativi ad interpreti</strong>
          </p>
          <div class="table-contents">
            <table class="table" summary="Elenco di pacchetti relativi ad interpreti" border="1">
              <colgroup>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
              </colgroup>
              <thead>
                <tr>
                  <th style="text-align: left"> pacchetto </th>
                  <th style="text-align: left"> popcon </th>
                  <th style="text-align: left"> dimensione </th>
                  <th style="text-align: left"> documentazione </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/dash"> <code class="literal">dash</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=dash">V:894, I:995</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/d/dash.html">191</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Unix_shell">sh</a>: piccola e veloce shell conforme a POSIX per
<code class="literal">sh</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/bash"> <code class="literal">bash</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bash">V:821, I:999</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/b/bash.html">7163</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Unix_shell">sh</a>: "<code class="literal">info bash</code>" fornito da
<code class="literal">bash-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/mawk"> <code class="literal">mawk</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=mawk">V:391, I:997</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/m/mawk.html">263</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/AWK">AWK</a>: <code class="literal">awk</code> piccolo e veloce </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/gawk"> <code class="literal">gawk</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gawk">V:313, I:402</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/gawk.html">2456</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/AWK">AWK</a>: "<code class="literal">info gawk</code>" fornito da
<code class="literal">gawk-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/perl"> <code class="literal">perl</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=perl">V:644, I:990</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/perl.html">669</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://it.wikipedia.org/wiki/Perl">Perl</a>: <code class="literal">perl</code>(1) e pagine HTML
fornite da <code class="literal">perl-doc</code> e <code class="literal">perl-doc-html</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/libterm-readline-gnu-perl">
<code class="literal">libterm-readline-gnu-perl</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libterm-readline-gnu-perl">V:2, I:30</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/libt/libterm-readline-gnu-perl.html">379</a>
                  </td>
                  <td style="text-align: left"> Estensione Perl per la libreria GNU ReadLine/History:
<code class="literal">perlsh</code>(1) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/libreply-perl">
<code class="literal">libreply-perl</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libreply-perl">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/libr/libreply-perl.html">171</a>
                  </td>
                  <td style="text-align: left"> REPL per Perl: <code class="literal">reply</code>(1) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/libdevel-repl-perl">
<code class="literal">libdevel-repl-perl</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libdevel-repl-perl">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/libd/libdevel-repl-perl.html">237</a>
                  </td>
                  <td style="text-align: left"> REPL per Perl: <code class="literal">re.pl</code>(1) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/python3">
<code class="literal">python3</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=python3">V:726, I:931</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/python3.html">80</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://it.wikipedia.org/wiki/Python">Python</a>: <code class="literal">python3</code>(1) e pagine
HTML fornite da <code class="literal">python3-doc</code></td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/tcl"> <code class="literal">tcl</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=tcl">V:28, I:268</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/t/tcl.html">22</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://it.wikipedia.org/wiki/Tcl">Tcl</a>: <code class="literal">tcl</code>(3) e le pagine
dettagliate di manuale fornite da <code class="literal">tcl-doc</code></td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/tk"> <code class="literal">tk</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=tk">V:22, I:261</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/t/tk.html">22</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Tk_(software)">Tk</a>: <code class="literal">tk</code>(3) e le pagine
dettagliate di manuale fornite da <code class="literal">tk-doc</code></td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/ruby"> <code class="literal">ruby</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=ruby">V:112, I:254</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/r/ruby.html">29</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://it.wikipedia.org/wiki/Ruby">Ruby</a>: <code class="literal">ruby</code>(1),
<code class="literal">erb</code>(1), <code class="literal">irb</code>(1),
<code class="literal">rdoc</code>(1), <code class="literal">ri</code>(1) </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <br class="table-break"/>
        <p>Quando si desidera automatizzare un compito in Debian, si dovrebbe prima
creare uno script per esso con un linguaggio interpretato. Le linee guida
per la scelta del linguaggio interpretato sono:</p>
        <div class="itemizedlist">
          <ul class="itemizedlist">
            <li class="listitem">
              <p> Usare <code class="literal">dash</code> se il compito è semplice e combina programmi
CLI con un programma della shell. </p>
            </li>
            <li class="listitem">
              <p> Usare <code class="literal">python3</code> se il compito non è semplice e si sta
cercando di scriverlo da zero. </p>
            </li>
            <li class="listitem">
              <p> Usare <code class="literal">perl</code>, <code class="literal">tcl</code>,
<code class="literal">ruby</code>, ... se è disponibile del codice preesistente in
Debian che usa uno di questi linguaggi e che deve essere ritoccato per fare
il compito. </p>
            </li>
          </ul>
        </div>
        <p>Se il codice risultante è troppo lento, si può riscrivere solo la porzione
critica per la velocità d'esecuzione in un linguaggio compilato e chiamarla
dal linguaggio interpretato.</p>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_debugging_interpreter_codes"/>12.2.1. Fare il debug di codice di linguaggi interpretati</h3>
              </div>
            </div>
          </div>
          <p>La maggior parte degli interpreti offre un controllo di base della sintassi
e funzionalità di tracciamento del codice.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> “<span class="strong"><strong>dash -n</strong></span> <span class="emphasis"><em>script.sh</em></span>”
- Controllo della sintassi di uno script di Shell </p>
              </li>
              <li class="listitem">
                <p> “<span class="strong"><strong>dash -x</strong></span> <span class="emphasis"><em>script.sh</em></span>”
- Tracciamento di uno script di Shell </p>
              </li>
              <li class="listitem">
                <p> “<span class="strong"><strong>python -m py_compile</strong></span>
<span class="emphasis"><em>script.py</em></span>” - Controllo della sintassi di uno script
Python </p>
              </li>
              <li class="listitem">
                <p> “<span class="strong"><strong>python -mtrace --trace</strong></span>
<span class="emphasis"><em>script.py</em></span>” - Tracciamento di uno script Python </p>
              </li>
              <li class="listitem">
                <p> “<span class="strong"><strong>perl -I ../libpath -c</strong></span>
<span class="emphasis"><em>script.pl</em></span>” - Controllo della sintassi di uno script
Perl </p>
              </li>
              <li class="listitem">
                <p> “<span class="strong"><strong>perl -d:Trace</strong></span>
<span class="emphasis"><em>script.pl</em></span>” - Tracciamento di uno script Perl </p>
              </li>
            </ul>
          </div>
          <p>Per testare codice per <code class="literal">dash</code>, provare <a class="xref" href="ch09.it.html#_readline_wrapper" title="9.1.4. Wrapper per readline">Sezione 9.1.4, «Wrapper per readline»</a> che è adatto ad ambienti interattivi in stile
<code class="literal">bash</code>.</p>
          <p>Per testare codice per <code class="literal">perl</code> provare l'ambiente REPL per
Perl che crea un ambiente <a class="ulink" href="https://en.wikipedia.org/wiki/Read–eval–print_loop">REPL (=READ +
EVAL + PRINT + LOOP)</a> in stile <a class="ulink" href="https://it.wikipedia.org/wiki/Python">Python</a>
per <a class="ulink" href="https://it.wikipedia.org/wiki/Perl">Perl</a>. </p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_gui_program_with_the_shell_script"/>12.2.2. Programma GUI con script di shell</h3>
              </div>
            </div>
          </div>
          <p>Uno script di shell può essere migliorato per creare un attraente programma
GUI. Il trucco è di usare uno dei cosiddetti programmi di dialogo invece di
interazioni tristi che usano i comandi <code class="literal">echo</code> e
<code class="literal">read</code>.</p>
          <div class="table">
            <a id="listofdialogprograms"/>
            <p class="title">
              <strong>Tabella 12.9. Elenco di programmi per dialoghi</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di programmi per dialoghi" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> pacchetto </th>
                    <th style="text-align: left"> popcon </th>
                    <th style="text-align: left"> dimensione </th>
                    <th style="text-align: left"> descrizione </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/x11-utils">
<code class="literal">x11-utils</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=x11-utils">V:169, I:556</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/x/x11-utils.html">712</a>
                    </td>
                    <td style="text-align: left"><code class="literal">xmessage</code>(1): mostra un messaggio o richiesta in una
finestra (X) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/whiptail">
<code class="literal">whiptail</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=whiptail">V:258, I:996</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/w/whiptail.html">57</a>
                    </td>
                    <td style="text-align: left"> mostra riquadri di dialogo amichevoli da script di shell (newt) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/dialog">
<code class="literal">dialog</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=dialog">V:13, I:113</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/d/dialog.html">1213</a>
                    </td>
                    <td style="text-align: left"> mostra riquadri di dialogo amichevoli da script di shell (ncurses) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/zenity">
<code class="literal">zenity</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=zenity">V:74, I:356</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/z/zenity.html">167</a>
                    </td>
                    <td style="text-align: left"> mostra riquadri di dialogo grafici da script di shell (GTK) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/ssft"> <code class="literal">ssft</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=ssft">V:0, I:0</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/s/ssft.html">75</a>
                    </td>
                    <td style="text-align: left"> Shell Scripts Frontend Tool, strumento per frontend per script di shell
(contenitore per zenity, kdialog, e dialog con gettext) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/gettext">
<code class="literal">gettext</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gettext">V:55, I:278</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/g/gettext.html">5825</a>
                    </td>
                    <td style="text-align: left"> "<code class="literal">/usr/bin/gettext.sh</code>": traduce messaggi </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>Ecco un esempio di programma con GUI per dimostrare come è semplice facile
farlo con uno script di shell.</p>
          <p>Questo script usa <code class="literal">zenity</code> per selezionare un file (in
maniera predefinita <code class="literal">/etc/motd</code>) e visualizzarlo.</p>
          <p>L'avviatore GUI per questo script può essere creato seguendo <a class="xref" href="ch09.it.html#_starting_a_program_from_gui" title="9.4.10. Avviare un programma dalla GUI">Sezione 9.4.10, «Avviare un programma dalla GUI»</a>.</p>
          <pre class="screen">#!/bin/sh -e
# Copyright (C) 2021 Osamu Aoki &lt;osamu@debian.org&gt;, Public Domain
# vim:set sw=2 sts=2 et:
DATA_FILE=$(zenity --file-selection --filename="/etc/motd" --title="Select a file to check") || \
  ( echo "E: File selection error" &gt;&amp;2 ; exit 1 )
# Check size of archive
if ( file -ib "$DATA_FILE" | grep -qe '^text/' ) ; then
  zenity --info --title="Check file: $DATA_FILE" --width 640  --height 400 \
    --text="$(head -n 20 "$DATA_FILE")"
else
  zenity --info --title="Check file: $DATA_FILE" --width 640  --height 400 \
    --text="The data is MIME=$(file -ib "$DATA_FILE")"
fi</pre>
          <p>Questo tipo di approccio ad un programma GUI con script di shell è utile
solamente per casi di scelta semplice. Se si sta scrivendo un programma con
funzioni complesse, considerare l'idea di scriverlo con una piattaforma con
più potenzialità.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_custom_actions_for_gui_filer"/>12.2.3. Azioni personalizzate per un gestore di file con GUI</h3>
              </div>
            </div>
          </div>
          <p>I programmi di gestione di file con GUI possono essere estesi per effettuare
alcune azioni comuni su file selezionati usando pacchetti di estensione
aggiuntivi. È anche possibile fargli fare azioni personalizzate specifiche
aggiungendo script specifici dell'utente.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p>Per GNOME, vedere <a class="ulink" href="https://help.ubuntu.com/community/NautilusScriptsHowto">NautilusScriptsHowto</a>. </p>
              </li>
              <li class="listitem">
                <p>Per KDE, vedere <a class="ulink" href="https://develop.kde.org/docs/dolphin/service-menus/">Creating Dolphin
Service Menus</a>. </p>
              </li>
              <li class="listitem">
                <p>Per Xfce, vedere <a class="ulink" href="https://docs.xfce.org/xfce/thunar/custom-actions">Thunar - Custom
Actions</a> e <a class="ulink" href="https://help.ubuntu.com/community/ThunarCustomActions">https://help.ubuntu.com/community/ThunarCustomActions</a>. </p>
              </li>
              <li class="listitem">
                <p>Per LXDE, vedere <a class="ulink" href="https://manual.lubuntu.me/stable/2/2.4/2.4.4/pcmanfm-qt.html#custom-actions">Custom Actions</a>. </p>
              </li>
            </ul>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_perl_short_script_madness"/>12.2.4. Pazzie con corti script Perl</h3>
              </div>
            </div>
          </div>
          <p>Per elaborare dati, <code class="literal">sh</code> deve generare sottoprocessi che
eseguono <code class="literal">cut</code>, <code class="literal">grep</code>,
<code class="literal">sed</code>, ecc., ed è lento. D'altro canto,
<code class="literal">perl</code> ha capacità interne per elaborare i dati, perciò è
veloce. Molti script di manutenzione del sistema in Debian usano
<code class="literal">perl</code>.</p>
          <p>Si consideri il seguente pezzetto di script AWK e i suoi equivalenti in
Perl.</p>
          <pre class="screen">awk '($2=="1957") { print $3 }' |</pre>
          <p>Ciò equivale ad una qualsiasi delle righe seguenti.</p>
          <pre class="screen">perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |</pre>
          <pre class="screen">perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |</pre>
          <pre class="screen">perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |</pre>
          <pre class="screen">perl -lane 'print $F[2] if $F[1] eq "1957"' |</pre>
          <pre class="screen">perl -lane 'print$F[2]if$F[1]eq+1957' |</pre>
          <p>L'ultima è una sorta di indovinello; sfrutta le seguenti caratteristiche di
Perl.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> Gli spazi bianchi sono opzionali.  </p>
              </li>
              <li class="listitem">
                <p> Esiste una conversione automatica da numero a stringa.  </p>
              </li>
              <li class="listitem">
                <p> Trucchi di esecuzione di Perl attraverso opzioni della riga di comando:
<code class="literal">perlrun</code>(1) </p>
              </li>
              <li class="listitem">
                <p> Variabili speciali di Perl: <code class="literal">perlvar</code>(1) </p>
              </li>
            </ul>
          </div>
          <p>La flessibilità è il punto di forza di Perl. Al contempo, ciò permette di
creare codici criptici e ingarbugliati. Perciò fare attenzione.</p>
          <p>Per altri script Perl pazzi, <a class="ulink" href="http://perlgolf.sourceforge.net">Perl Golf</a>
potrebbe essere interessante.</p>
        </div>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_coding_in_compiled_languages"/>12.3. Scrivere codice in linguaggi compilati</h2>
            </div>
          </div>
        </div>
        <div class="table">
          <a id="listofcompilerrelatedpackages"/>
          <p class="title">
            <strong>Tabella 12.10. Elenco di pacchetti relativi al compilatore</strong>
          </p>
          <div class="table-contents">
            <table class="table" summary="Elenco di pacchetti relativi al compilatore" border="1">
              <colgroup>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
              </colgroup>
              <thead>
                <tr>
                  <th style="text-align: left"> pacchetto </th>
                  <th style="text-align: left"> popcon </th>
                  <th style="text-align: left"> dimensione </th>
                  <th style="text-align: left"> descrizione </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/gcc"> <code class="literal">gcc</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gcc">V:153, I:565</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/gcc.html">47</a>
                  </td>
                  <td style="text-align: left"> Compilatore di GNU C</td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/libc6-dev">
<code class="literal">libc6-dev</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libc6-dev">V:246, I:581</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/libc/libc6-dev.html">11954</a>
                  </td>
                  <td style="text-align: left"> Libreria GNU C: librerie di sviluppo e file header</td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/g++"> <code class="literal">g++</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=g++">V:56, I:503</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/g++.html">14</a>
                  </td>
                  <td style="text-align: left"> Compilatore di GNU C++ </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/libstdc++-10-dev">
<code class="literal">libstdc++-10-dev</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libstdc++-10-dev">V:38, I:269</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/libs/libstdc++-10-dev.html">17587</a>
                  </td>
                  <td style="text-align: left"> Libreria GNU Standard C++ v3 (file di sviluppo) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/cpp"> <code class="literal">cpp</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=cpp">V:317, I:727</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/c/cpp.html">30</a>
                  </td>
                  <td style="text-align: left"> Preprocessore GNU C </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/gettext">
<code class="literal">gettext</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gettext">V:55, I:278</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/gettext.html">5825</a>
                  </td>
                  <td style="text-align: left"> Utilità GNU Internationalization </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/glade"> <code class="literal">glade</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=glade">V:0, I:6</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/glade.html">1209</a>
                  </td>
                  <td style="text-align: left"> Costruttore dell'interfaccia utente GTK </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/valac"> <code class="literal">valac</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=valac">V:0, I:5</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/v/valac.html">717</a>
                  </td>
                  <td style="text-align: left"> Linguaggio in stile C# per il sistema GObject </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/flex"> <code class="literal">flex</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=flex">V:8, I:82</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/f/flex.html">1260</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator)">Veloce generatore di
analizzatori lessicali</a> compatibile con <a class="ulink" href="https://en.wikipedia.org/wiki/Lex_(software)">LEX</a> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/bison"> <code class="literal">bison</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bison">V:8, I:89</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/b/bison.html">3116</a>
                  </td>
                  <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/GNU_Bison">generatore di parser</a> compatibile con
<a class="ulink" href="https://it.wikipedia.org/wiki/Yacc">YACC</a> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/susv2"> <code class="literal">susv2</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=susv2">I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/s/susv2.html">16</a>
                  </td>
                  <td style="text-align: left"> scarica le specifiche "<a class="ulink" href="http://www.unix.org/version2/">The
Single UNIX Specifications v2</a>" </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/susv3"> <code class="literal">susv3</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=susv3">I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/s/susv3.html">16</a>
                  </td>
                  <td style="text-align: left"> scarica le specifiche "<a class="ulink" href="http://www.unix.org/version3/">The
Single UNIX Specifications v3</a>" </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/golang">
<code class="literal">golang</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=golang">I:20</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/golang.html">12</a>
                  </td>
                  <td style="text-align: left"> Compilatore del linguaggio di programmazione Go </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/rustc"> <code class="literal">rustc</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=rustc">V:3, I:13</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/r/rustc.html">7753</a>
                  </td>
                  <td style="text-align: left"> Linguaggio di programmazione Rust </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/haskell-platform">
<code class="literal">haskell-platform</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=haskell-platform">I:4</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/h/haskell-platform.html">12</a>
                  </td>
                  <td style="text-align: left"> Librerie e strumenti standard di <a class="ulink" href="https://it.wikipedia.org/wiki/Haskell_(linguaggio)">Haskell</a> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/gfortran">
<code class="literal">gfortran</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gfortran">V:8, I:75</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/gfortran.html">16</a>
                  </td>
                  <td style="text-align: left"> Compilatore GNU Fortran 95 </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/fpc"> <code class="literal">fpc</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=fpc">I:3</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/f/fpc.html">102</a>
                  </td>
                  <td style="text-align: left"> Free Pascal </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <br class="table-break"/>
        <p>Qui sono inclusi <a class="xref" href="ch12.it.html#_flex_a_better_lex" title="12.3.3. Flex - un Lex migliorato">Sezione 12.3.3, «Flex - un Lex migliorato»</a> e <a class="xref" href="ch12.it.html#_bison_a_better_yacc" title="12.3.4. Bison - Yacc migliorato">Sezione 12.3.4, «Bison - Yacc migliorato»</a> per indicare come programmi simili a
compilatori possono essere scritti in linguaggio C compilando descrizioni di
più alto livello in linguaggio C.</p>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_c"/>12.3.1. C</h3>
              </div>
            </div>
          </div>
          <p>Si può impostare l'ambiente appropriato per compilare programmi scritti nel
<a class="ulink" href="https://it.wikipedia.org/wiki/C_(linguaggio)">linguaggio di programmazione C</a>
nel modo seguente.</p>
          <pre class="screen"># apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential</pre>
          <p>Il pacchetto <code class="literal">libc6-dev</code>, cioè la libreria GNU C, fornisce
la <a class="ulink" href="https://it.wikipedia.org/wiki/Libreria_standard_del_C">libreria standard C</a> che è una
raccolta di file header e routine di libreria usati dal linguaggio di
programmazione C.</p>
          <p>Vedere come documenti di riferimento per C i seguenti.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> "<code class="literal">info libc</code>" (documento di riferimento per le funzioni
della libreria C) </p>
              </li>
              <li class="listitem">
                <p> <code class="literal">gcc</code>(1) e "<code class="literal">info gcc</code>" </p>
              </li>
              <li class="listitem">
                <p> <code class="literal">ogni_nome_di_funzione_della_libreria_C</code>(3) </p>
              </li>
              <li class="listitem">
                <p> Kernighan &amp; Ritchie, "The C Programming Language", 2nd edition (Prentice
Hall) </p>
              </li>
            </ul>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_simple_c_program_gcc"/>12.3.2. Semplice programma in C (gcc)</h3>
              </div>
            </div>
          </div>
          <p>Un semplice esempio "<code class="literal">esempio.c</code>" può essere compilato con
una libreria "<code class="literal">libm</code>" in un eseguibile
"<code class="literal">eseg_esempio</code>" nel modo seguente.</p>
          <pre class="screen">$ cat &gt; example.c &lt;&lt; EOF
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#include &lt;string.h&gt;

int main(int argc, char **argv, char **envp){
        double x;
        char y[11];
        x=sqrt(argc+7.5);
        strncpy(y, argv[0], 10); /* prevent buffer overflow */
        y[10] = '\0'; /* fill to make sure string ends with '\0' */
        printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
        return 0;
}
EOF
$ gcc -Wall -g -o run_example example.c -lm
$ ./run_example
        1, 2.915, ./run_exam,     (null)
$ ./run_example 1234567890qwerty
        2, 3.082, ./run_exam, 1234567890qwerty</pre>
          <p>In questo esempio, l'uso di "<code class="literal">-lm</code>" è necessario per fare
il link alla libreria "<code class="literal">/usr/lib/libm.so</code>" nel pacchetto
<code class="literal">libc6</code> per <code class="literal">sqrt</code>(3). La libreria reale è
in "<code class="literal">/lib/</code>" con nome file "<code class="literal">libm.so.6</code>",
che è un collegamento simbolico a "<code class="literal">libm-2.7.so</code>".</p>
          <p>Si guardi l'ultimo elemento nel testo di output: ci sono più di 10 caratteri
anche se è stato specificato "<code class="literal">%10s</code>".</p>
          <p>L'uso di funzioni che operano su puntatori di memoria senza controlli sui
limiti, come <code class="literal">sprintf</code>(3) e <code class="literal">strcpy</code>(3) è
deprecato per prevenire exploit di tipo buffer overflow che sfruttano gli
effetti di superamento dei limiti di grandezza dei dati.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_flex_a_better_lex"/>12.3.3. Flex - un Lex migliorato</h3>
              </div>
            </div>
          </div>
          <p><a class="ulink" href="https://it.wikipedia.org/wiki/GNU_flex">Flex</a> è un veloce generatore di <a class="ulink" href="https://it.wikipedia.org/wiki/Analisi_lessicale_(informatica)">analizzatori lessicali</a> compatibile con
<a class="ulink" href="https://en.wikipedia.org/wiki/Lex_(software)">Lex</a>.</p>
          <p>Un tutorial per <code class="literal">flex</code>(1) viene fornito da "<code class="literal">info
flex</code>".</p>
          <p>È necessario fornire i propri "<code class="literal">main()</code>" e
"<code class="literal">yywrap()</code>". Altrimenti il proprio programma flex dovrebbe
apparire così per compilare senza una libreria. Questo è dovuto al fatto che
"<code class="literal">yywrap</code>" è una macro e "<code class="literal">%option main</code>"
abilita implicitamente "<code class="literal">%option noyywrap</code>".</p>
          <pre class="screen">%option main
%%
.|\n    ECHO ;
%%</pre>
          <p>In alternativa si può compilare con l'opzione per linker "<code class="literal">
-lfl</code>" alla fine della propria riga di comando
<code class="literal">cc</code>(1) (come "<code class="literal">-ll</code>" per
AT&amp;T-Lex). In questo caso non è necessario usare
"<code class="literal">%option</code>".</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_bison_a_better_yacc"/>12.3.4. Bison - Yacc migliorato</h3>
              </div>
            </div>
          </div>
          <p>Svariati pacchetti Debian forniscono un generatore di <a class="ulink" href="https://it.wikipedia.org/wiki/Parser_LR">parser LR</a> lookahead o <a class="ulink" href="https://en.wikipedia.org/wiki/LALR_parser">parser LALR</a> combatibile con <a class="ulink" href="https://it.wikipedia.org/wiki/Yacc">Yacc</a>.</p>
          <div class="table">
            <a id="listofyacccompatparsergenerators"/>
            <p class="title">
              <strong>Tabella 12.11. Elenco di generatori di parser LALR compatibili con Yacc</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di generatori di parser LALR compatibili con Yacc" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> pacchetto </th>
                    <th style="text-align: left"> popcon </th>
                    <th style="text-align: left"> dimensione </th>
                    <th style="text-align: left"> descrizione </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/bison"> <code class="literal">bison</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bison">V:8, I:89</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/b/bison.html">3116</a>
                    </td>
                    <td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/GNU_bison">generatore GNU di parser LALR</a> </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/byacc"> <code class="literal">byacc</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=byacc">V:0, I:5</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/b/byacc.html">258</a>
                    </td>
                    <td style="text-align: left"> generatore Berkeley di parser LALR </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/btyacc">
<code class="literal">btyacc</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=btyacc">V:0, I:0</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/b/btyacc.html">243</a>
                    </td>
                    <td style="text-align: left"> generatore di parser backtracking basato su <code class="literal">byacc</code> </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>Un tutorial per <code class="literal">bison</code>(1) viene fornito da "<code class="literal">info
bison</code>".</p>
          <p>È necessario fornire i propri "<code class="literal">main()</code>" e
"<code class="literal">yyerror()</code>". "<code class="literal">main()</code>" chiama
"<code class="literal">yyparse()</code>" che a sua volta chiama
"<code class="literal">yylex()</code>", solitamente creato con Flex.</p>
          <pre class="screen">%%

%%</pre>
        </div>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_static_code_analysis_tools"/>12.4. Strumenti di analisi statica del codice </h2>
            </div>
          </div>
        </div>
        <p>Strumenti simili a <a class="ulink" href="https://en.wikipedia.org/wiki/Lint_programming_tool">lint</a> possono aiutare
nell'<a class="ulink" href="https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis">analisi statica del codice</a>.</p>
        <p>Strumenti simili ad <a class="ulink" href="https://en.wikipedia.org/wiki/Indent_(Unix)">Indent</a> possono aiutare
nella revisione manuale del codice riformattando in modo coerente il codice
sorgente.</p>
        <p>Strumenti simili a <a class="ulink" href="https://en.wikipedia.org/wiki/Ctags">Ctags</a> possono aiutare nella
revisione manuale del codice generando un file indice (o tag) dei nomi
trovati nel codice sorgente.</p>
        <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
          <table border="0" summary="Tip">
            <tr>
              <td rowspan="2" align="center" valign="top">
                <img alt="[Suggerimento]" src="images/tip.png"/>
              </td>
              <th align="left">Suggerimento</th>
            </tr>
            <tr>
              <td align="left" valign="top">
                <p>Configurare il proprio editor preferito (<code class="literal">emacs</code> o
<code class="literal">vim</code>) in modo che usi plugin per motori per lint asincroni
aiuta nella scrittura di codice. Questi plugin stanno diventando molto
potenti poiché sfruttano il <a class="ulink" href="https://en.wikipedia.org/wiki/Language_Server_Protocol">Language
Server Protocol</a>. Dato che sono in continuo sviluppo, usare il codice
originale a monte, invece dei pacchetti Debian, potrebbe essere una buona
opzione.</p>
              </td>
            </tr>
          </table>
        </div>
        <div class="table">
          <a id="listoftoolsforstaticcodeanalysis"/>
          <p class="title">
            <strong>Tabella 12.12. Elenco di strumenti per l'analisi statica del codice</strong>
          </p>
          <div class="table-contents">
            <table class="table" summary="Elenco di strumenti per l'analisi statica del codice" border="1">
              <colgroup>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
              </colgroup>
              <thead>
                <tr>
                  <th style="text-align: left"> pacchetto </th>
                  <th style="text-align: left"> popcon </th>
                  <th style="text-align: left"> dimensione </th>
                  <th style="text-align: left"> descrizione </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/vim-ale">
<code class="literal">vim-ale</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=vim-ale">I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/v/vim-ale.html">2591</a>
                  </td>
                  <td style="text-align: left"> motore per lint asincrono per Vim 8 e NeoVim </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/vim-syntastic">
<code class="literal">vim-syntastic</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=vim-syntastic">I:3</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/v/vim-syntastic.html">1379</a>
                  </td>
                  <td style="text-align: left"> trucchi per controllo della sintassi per vim </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/elpa-flycheck">
<code class="literal">elpa-flycheck</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=elpa-flycheck">V:0, I:1</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/e/elpa-flycheck.html">792</a>
                  </td>
                  <td style="text-align: left"> controllo della sintassi al-volo moderno per Emacs </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/elpa-relint">
<code class="literal">elpa-relint</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=elpa-relint">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/e/elpa-relint.html">135</a>
                  </td>
                  <td style="text-align: left"> strumento per trovare errori in regexp per Emacs Lisp </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/cppcheck-gui">
<code class="literal">cppcheck-gui</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=cppcheck-gui">V:0, I:1</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/c/cppcheck-gui.html">6196</a>
                  </td>
                  <td style="text-align: left"> strumento per l'analisi statica del codice C/C++ (GUI) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/shellcheck">
<code class="literal">shellcheck</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=shellcheck">V:2, I:11</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/s/shellcheck.html">18987</a>
                  </td>
                  <td style="text-align: left"> strumento lint per script di shell </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/pyflakes3">
<code class="literal">pyflakes3</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=pyflakes3">V:1, I:14</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/pyflakes3.html">24</a>
                  </td>
                  <td style="text-align: left"> controllo passivo di programmi Python 3 </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/pylint">
<code class="literal">pylint</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=pylint">V:4, I:17</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/pylint.html">1976</a>
                  </td>
                  <td style="text-align: left"> strumento di controllo statico del codice Python </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/perl"> <code class="literal">perl</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=perl">V:644, I:990</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/perl.html">669</a>
                  </td>
                  <td style="text-align: left"> interprete con controllore interno statico del codice:
<code class="literal">B::Lint</code>(3perl) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/rubocop">
<code class="literal">rubocop</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=rubocop">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/r/rubocop.html">3247</a>
                  </td>
                  <td style="text-align: left"> strumento di analisi statica del codice Ruby </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/clang-tidy">
<code class="literal">clang-tidy</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=clang-tidy">V:1, I:8</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/c/clang-tidy.html">21</a>
                  </td>
                  <td style="text-align: left"> strumento per ling per C++ basato su Clang </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/splint">
<code class="literal">splint</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=splint">V:0, I:3</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/s/splint.html">2320</a>
                  </td>
                  <td style="text-align: left"> strumento per controllare staticamente la presenza di bug in programmi C </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/flawfinder">
<code class="literal">flawfinder</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=flawfinder">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/f/flawfinder.html">205</a>
                  </td>
                  <td style="text-align: left"> strumento per esaminare codice sorgente C/C++ e per cercare punti deboli per
la sicurezza </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/black"> <code class="literal">black</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=black">V:2, I:8</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/b/black.html">557</a>
                  </td>
                  <td style="text-align: left"> formattatore di codice Python senza compromessi </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/perltidy">
<code class="literal">perltidy</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=perltidy">V:0, I:4</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/perltidy.html">2338</a>
                  </td>
                  <td style="text-align: left"> strumento per rientri e riformattazione di script Perl </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/indent">
<code class="literal">indent</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=indent">V:0, I:9</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/i/indent.html">426</a>
                  </td>
                  <td style="text-align: left"> programma per formattazione di codice sorgente in linguaggio C </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/astyle">
<code class="literal">astyle</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=astyle">V:0, I:3</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/a/astyle.html">761</a>
                  </td>
                  <td style="text-align: left"> strumento per rientri in codice sorgente per C, C++, Objective-C, C# e Java </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/bcpp"> <code class="literal">bcpp</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bcpp">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/b/bcpp.html">111</a>
                  </td>
                  <td style="text-align: left"> abbellitore di C(++) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/xmlindent">
<code class="literal">xmlindent</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=xmlindent">V:0, I:1</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/x/xmlindent.html">53</a>
                  </td>
                  <td style="text-align: left"> riformattatore di flussi XML </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/global">
<code class="literal">global</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=global">V:1, I:2</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/global.html">1896</a>
                  </td>
                  <td style="text-align: left"> strumenti per ricerca e navigazione di codice sorgente </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/exuberant-ctags">
<code class="literal">exuberant-ctags</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=exuberant-ctags">V:3, I:25</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/e/exuberant-ctags.html">345</a>
                  </td>
                  <td style="text-align: left"> costruzione di file indice di tag di definizioni di codice sorgente </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <br class="table-break"/>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_debug"/>12.5. Debug</h2>
            </div>
          </div>
        </div>
        <p>Il debug è un'importante fase del processo di programmazione. Sapere come
fare il debug dei programmi rende buoni utenti Debian in grado di creare
segnalazioni di bug sensate.</p>
        <div class="table">
          <a id="listofdebugpackages"/>
          <p class="title">
            <strong>Tabella 12.13. Elenco di pacchetti relativi al debug</strong>
          </p>
          <div class="table-contents">
            <table class="table" summary="Elenco di pacchetti relativi al debug" border="1">
              <colgroup>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
              </colgroup>
              <thead>
                <tr>
                  <th style="text-align: left"> pacchetto </th>
                  <th style="text-align: left"> popcon </th>
                  <th style="text-align: left"> dimensione </th>
                  <th style="text-align: left"> documentazione </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/gdb"> <code class="literal">gdb</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gdb">V:13, I:101</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/g/gdb.html">10847</a>
                  </td>
                  <td style="text-align: left"> "<code class="literal">info gdb</code>" fornito da <code class="literal">gdb-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/ddd"> <code class="literal">ddd</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=ddd">V:0, I:9</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/d/ddd.html">4105</a>
                  </td>
                  <td style="text-align: left"> "<code class="literal">info ddd</code>" fornito da <code class="literal">ddd-doc</code> </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <br class="table-break"/>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_basic_gdb_execution"/>12.5.1. Esecuzione base di gdb</h3>
              </div>
            </div>
          </div>
          <p>Lo <a class="ulink" href="https://it.wikipedia.org/wiki/Debugger">strumento di debug</a> principale in Debian è
<code class="literal">gdb</code>(1) che permette di ispezionare un programma mentre
viene eseguito.</p>
          <p>Installare <code class="literal">gdb</code> e i programmi correlati nel modo seguente.</p>
          <pre class="screen"># apt-get install gdb gdb-doc build-essential devscripts</pre>
          <p>Un buon tutorial per <code class="literal">gdb</code> può essere trovato su:</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> “<code class="literal">info gdb</code>” </p>
              </li>
              <li class="listitem">
                <p> “Debugging with GDB” in
<code class="literal">/usr/share/doc/gdb-doc/html/gdb/index.html</code>  </p>
              </li>
              <li class="listitem">
                <p> “<a class="ulink" href="http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html">tutorial sul web</a>” </p>
              </li>
            </ul>
          </div>
          <p>Quello che segue è un piccolo esempio d'uso di <code class="literal">gdb</code>(1) su
di un "<code class="literal">programma</code>" compilato con l'opzione
"<code class="literal">-g</code>" per produrre informazioni di debug.</p>
          <pre class="screen">$ gdb program
(gdb) b 1                # set break point at line 1
(gdb) run args           # run program with args
(gdb) next               # next line
...
(gdb) step               # step forward
...
(gdb) p parm             # print parm
...
(gdb) p parm=12          # set value to 12
...
(gdb) quit</pre>
          <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Tip">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Suggerimento]" src="images/tip.png"/>
                </td>
                <th align="left">Suggerimento</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Molti comandi <code class="literal">gdb</code>(1) possono essere
abbreviati. L'espansione del tasto di tabulazione funziona come nella shell.</p>
                </td>
              </tr>
            </table>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_debugging_the_debian_package"/>12.5.2. Fare il debug di pacchetti Debian</h3>
              </div>
            </div>
          </div>
          <p>Dato che tutti i binari installati in un sistema Debian dovrebbero avere, in
maniera predefinita, le informazioni di debug rimosse, la maggior parte dei
simboli di debug non sono presenti nei normali pacchetti. Per poter fare il
debug dei pacchetti Debian con <code class="literal">gdb</code>(1), è necessario
installare i pacchetti <code class="literal">*-dbgsym</code>
(es. <code class="literal">coreutils-dbgsym</code> in the case of
<code class="literal">coreutils</code>). I pacchetti sorgente generano automaticamente
pacchetti <code class="literal">*-dbgsym</code> insieme ai pacchetti binari normale e
tali pacchetti di debug vengono messi nell'archivio separato <a class="ulink" href="http://debug.mirrors.debian.org/debian-debug">debian-debug</a>. Per maggiori informazioni fare
riferimento agli <a class="ulink" href="https://wiki.debian.org/DebugPackage">articoli nel Wiki
Debian</a>.</p>
          <p>Se un pacchetto di cui si deve fare il debug non fornisce il proprio
pacchetto <code class="literal">*-dbgsym</code>, è necessario installarlo dopo averlo
ricompilato nel modo seguente.</p>
          <pre class="screen">$ mkdir /path/new ; cd /path/new
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install fakeroot devscripts build-essential
$ apt-get source package_name
$ cd package_name*
$ sudo apt-get build-dep ./</pre>
          <p>Correggere i bug se necessario.</p>
          <p>Spostare la versione del pacchetto ad una che non crei conflitti con le
versioni ufficiali di Debian, ad esempio una che termini con
"<code class="literal">+debug1</code>" quando si ricompilano versioni di cui esiste un
pacchetto, o una che termini con "<code class="literal">~pre1</code>" quando si
ricompilano versioni non ancora rilasciate in pacchetti nel modo seguente. </p>
          <pre class="screen">$ dch -i</pre>
          <p>Compilare ed installare i pacchetti con i simboli di debug nel modo
seguente.</p>
          <pre class="screen">$ export DEB_BUILD_OPTIONS="nostrip noopt"
$ debuild
$ cd ..
$ sudo debi package_name*.changes</pre>
          <p>È necessario controllare gli script di compilazione del pacchetto ed
assicurarsi di usare "<code class="literal">CFLAGS=-g -Wall</code>" per la
compilazione di binari.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_obtaining_backtrace"/>12.5.3. Ottenere un backtrace</h3>
              </div>
            </div>
          </div>
          <p>Quando un programma va in crash, è una buona idea inviare un segnalazione di
bug riportando le informazioni di backtrace.</p>
          <p>Il backtrace può essere ottenuto da <code class="literal">gdb</code>(1) utilizzando
uno dei seguenti approcci:</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p>Approccio "crash in GDB":</p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p>Eseguire il programma da GDB.</p>
                    </li>
                    <li class="listitem">
                      <p>Mandare in crash il programma.</p>
                    </li>
                    <li class="listitem">
                      <p>Digitare "<code class="literal">bt</code>" al prompt di GDB.</p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p>Approccio "prima il crash":</p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p>Aggiornare il file “<span class="strong"><strong>/etc/security/limits.conf</strong></span>” in modo che includa
quanto segue: </p>
                      <pre class="screen">* soft core unlimited</pre>
                    </li>
                    <li class="listitem">
                      <p>Digitare "<code class="literal">ulimit -c unlimited</code>" al prompt di shell.</p>
                    </li>
                    <li class="listitem">
                      <p>Eseguire il programma da questo prompt di shell.</p>
                    </li>
                    <li class="listitem">
                      <p>Mandare in crash il programma per produrre un file <a class="ulink" href="https://en.wikipedia.org/wiki/Core_dump">core dump</a>.</p>
                    </li>
                    <li class="listitem">
                      <p>Caricare il file del <a class="ulink" href="https://en.wikipedia.org/wiki/Core_dump">core dump</a> in GDB con
"<code class="literal">gdb gdb ./program_binary core</code>".</p>
                    </li>
                    <li class="listitem">
                      <p>Digitare "<code class="literal">bt</code>" al prompt di GDB.</p>
                    </li>
                  </ul>
                </div>
              </li>
            </ul>
          </div>
          <p>Per situazioni con cicli infiniti o tastiera bloccata, si può forzare il
crash del programma premendo <code class="literal">Ctrl-\</code> o
<code class="literal">Ctrl-C</code> o eseguendo “<code class="literal">kill -ABRT
<span class="emphasis"><em>PID</em></span></code>”. (Vedere <a class="xref" href="ch09.it.html#_killing_a_process" title="9.4.12. Uccidere un processo">Sezione 9.4.12, «Uccidere un processo»</a>.)</p>
          <div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Tip">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Suggerimento]" src="images/tip.png"/>
                </td>
                <th align="left">Suggerimento</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Spesso si vede un backtrace in cui una o più delle prime righe sono in
"<code class="literal">malloc()</code>" o "<code class="literal">g_malloc()</code>". Quando ciò
accade è probabile che il backtrace non sia molto utile. Il metodo più
semplice per trovare informazioni utili è di impostare la variabile
d'ambiente "<code class="literal">$MALLOC_CHECK_</code>" al valore 2
(<code class="literal">malloc</code>(3)). Lo si può fare mentre si esegue
<code class="literal">gdb</code> nel modo seguente.</p>
                  <pre class="screen"> $ MALLOC_CHECK_=2 gdb hello</pre>
                </td>
              </tr>
            </table>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_advanced_gdb_commands"/>12.5.4. Comandi gdb avanzati</h3>
              </div>
            </div>
          </div>
          <div class="table">
            <a id="listofadvancedgdbcommands"/>
            <p class="title">
              <strong>Tabella 12.14. Elenco di comandi gdb avanzati</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di comandi gdb avanzati" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> comando </th>
                    <th style="text-align: left"> descrizione degli scopi del comando </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">(gdb) thread apply all bt</code> </td>
                    <td style="text-align: left"> ottenere un backtrace per tutti i thread di un programma multi-thread </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">(gdb) bt full</code> </td>
                    <td style="text-align: left"> ottenere i parametri nello stack delle chiamate di funzione </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">(gdb) thread apply all bt full</code> </td>
                    <td style="text-align: left"> ottenere un backtrace e parametri: combinazione delle due opzioni precedenti </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">(gdb) thread apply all bt full 10</code> </td>
                    <td style="text-align: left"> ottenere un backtrace e i parametri per le prime dieci chiamate nello stack
per eliminare l'output irrilevante </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">(gdb) set logging on</code> </td>
                    <td style="text-align: left"> scrivere un registro dell'output di <code class="literal">gdb</code> in un file (il
file predefinito è "<code class="literal">gdb.txt</code>") </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_check_dependency_on_libraries"/>12.5.5. Controllare le dipendenze dalle librerie</h3>
              </div>
            </div>
          </div>
          <p>Per scoprire le dipendenze di un programma da librerie, usare
<code class="literal">ldd</code>(1) nel modo seguente.</p>
          <pre class="screen">$ ldd /bin/ls
        librt.so.1 =&gt; /lib/librt.so.1 (0x4001e000)
        libc.so.6 =&gt; /lib/libc.so.6 (0x40030000)
        libpthread.so.0 =&gt; /lib/libpthread.so.0 (0x40153000)
        /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x40000000)</pre>
          <p>Affinché <code class="literal">ls</code>(1) funzioni in un ambiente "chroot", le
librerie in questione devono essere disponibili nell'ambiente "chroot".</p>
          <p>Vedere <a class="xref" href="ch09.it.html#_tracing_program_activities" title="9.4.6. Tenere traccia delle attività di un programma">Sezione 9.4.6, «Tenere traccia delle attività di un programma»</a>.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_dynamic_call_tracing_tools"/>12.5.6. Strumenti per tracciamento di chiamate dinamiche</h3>
              </div>
            </div>
          </div>
          <p>In Debian sono disponibili diversi strumenti di tracciamento di chiamate
dinamiche. Vedere <a class="xref" href="ch09.it.html#_monitoring_controlling_and_starting_program_activities" title="9.4. Monitorare, controllare ed avviare l'attività dei programmi">Sezione 9.4, «Monitorare, controllare ed avviare l'attività dei programmi»</a>. </p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_debugging_x_errors"/>12.5.7. Fare il debug di errori X</h3>
              </div>
            </div>
          </div>
          <p>Se un programma gnome <code class="literal">preview1</code> ha ricevuto un errore X,
si dovrebbe leggere un messaggio del tipo seguente.</p>
          <pre class="screen">The program 'preview1' received an X Window System error.</pre>
          <p>Se ciò avviene, si può provare ad eseguire il programma con
"<code class="literal">--sync</code>" ed interrompere alla funzione
"<code class="literal">gdk_x_error</code>" per ottenere un backtrace.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_memory_leak_detection_tools"/>12.5.8. Strumenti per rilevazione di memory leak</h3>
              </div>
            </div>
          </div>
          <p>In Debian sono disponibili svariati strumenti di rilevazione di memory leak.</p>
          <div class="table">
            <a id="listofmemoryleakdetectiontools"/>
            <p class="title">
              <strong>Tabella 12.15. Elenco di strumenti per rilevazione di memory leak</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di strumenti per rilevazione di memory leak" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> pacchetto </th>
                    <th style="text-align: left"> popcon </th>
                    <th style="text-align: left"> dimensione </th>
                    <th style="text-align: left"> descrizione </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/libc6-dev">
<code class="literal">libc6-dev</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libc6-dev">V:246, I:581</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/libc/libc6-dev.html">11954</a>
                    </td>
                    <td style="text-align: left"><code class="literal">mtrace</code>(1): funzionalità di debug malloc in glibc </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/valgrind">
<code class="literal">valgrind</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=valgrind">V:6, I:38</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/v/valgrind.html">77683</a>
                    </td>
                    <td style="text-align: left"> strumento di debug e profilazione per la memoria </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/electric-fence">
<code class="literal">electric-fence</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=electric-fence">V:0, I:4</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/e/electric-fence.html">73</a>
                    </td>
                    <td style="text-align: left">strumento di debug <code class="literal">malloc</code>(3) </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/libdmalloc5">
<code class="literal">libdmalloc5</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libdmalloc5">V:0, I:3</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/libd/libdmalloc5.html">393</a>
                    </td>
                    <td style="text-align: left"> libreria per il debug dell'allocazione di memoria </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/duma"> <code class="literal">duma</code>
</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=duma">V:0, I:0</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/d/duma.html">293</a>
                    </td>
                    <td style="text-align: left"> libreria per rilevare buffer overrun e underrun in programmi C e C++ </td>
                  </tr>
                  <tr>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.debian.org/sid/leaktracer">
<code class="literal">leaktracer</code> </a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=leaktracer">V:0, I:2</a>
                    </td>
                    <td style="text-align: left">
                      <a class="ulink" href="http://packages.qa.debian.org/l/leaktracer.html">56</a>
                    </td>
                    <td style="text-align: left"> tracciatore di memory leak per programmi C++ </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_disassemble_binary"/>12.5.9. Disassemblatore di binari</h3>
              </div>
            </div>
          </div>
          <p>Si può disassemblare codice binario con <code class="literal">objdump</code>(1) nel
modo seguente.</p>
          <pre class="screen">$  objdump -m i386 -b binary -D /usr/lib/grub/x86_64-pc/stage1</pre>
          <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table border="0" summary="Note">
              <tr>
                <td rowspan="2" align="center" valign="top">
                  <img alt="[Nota]" src="images/note.png"/>
                </td>
                <th align="left">Nota</th>
              </tr>
              <tr>
                <td align="left" valign="top">
                  <p>Per disassemblare codice in modo interattivo si può usare
<code class="literal">gdb</code>(1).</p>
                </td>
              </tr>
            </table>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_build_tools"/>12.6. Strumenti di compilazione</h2>
            </div>
          </div>
        </div>
        <div class="table">
          <a id="listofbuildtoolpackages"/>
          <p class="title">
            <strong>Tabella 12.16. Elenco di pacchetti relativi alla compilazione</strong>
          </p>
          <div class="table-contents">
            <table class="table" summary="Elenco di pacchetti relativi alla compilazione" border="1">
              <colgroup>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
              </colgroup>
              <thead>
                <tr>
                  <th style="text-align: left"> pacchetto </th>
                  <th style="text-align: left"> popcon </th>
                  <th style="text-align: left"> dimensione </th>
                  <th style="text-align: left"> documentazione </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/make"> <code class="literal">make</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=make">V:147, I:574</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/m/make.html">1592</a>
                  </td>
                  <td style="text-align: left"> "<code class="literal">info make</code>" fornito da <code class="literal">make-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/autoconf">
<code class="literal">autoconf</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=autoconf">V:33, I:257</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/a/autoconf.html">2025</a>
                  </td>
                  <td style="text-align: left"> "<code class="literal">info autoconf</code>" fornito da
<code class="literal">autoconf-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/automake">
<code class="literal">automake</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=automake">V:34, I:256</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/a/automake.html">1837</a>
                  </td>
                  <td style="text-align: left"> "<code class="literal">info automake</code>" fornito da
<code class="literal">automake1.10-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/libtool">
<code class="literal">libtool</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=libtool">V:29, I:240</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/libt/libtool.html">1213</a>
                  </td>
                  <td style="text-align: left"> "<code class="literal">info libtool</code>" fornito da <code class="literal">libtool-doc</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/cmake"> <code class="literal">cmake</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=cmake">V:16, I:116</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/c/cmake.html">28897</a>
                  </td>
                  <td style="text-align: left"><code class="literal">cmake</code>(1), multipiattaforma, sistema make open source </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/ninja-build">
<code class="literal">ninja-build</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=ninja-build">V:5, I:34</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/n/ninja-build.html">417</a>
                  </td>
                  <td style="text-align: left"><code class="literal">ninja</code>(1), piccolo sistema di compilazione, il più vicino
in spirito a Make </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/meson"> <code class="literal">meson</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=meson">V:2, I:20</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/m/meson.html">3451</a>
                  </td>
                  <td style="text-align: left"><code class="literal">meson</code>(1), sistema di compilazione ad alta produttività
sulla base di <code class="literal">ninja</code> </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/xutils-dev">
<code class="literal">xutils-dev</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=xutils-dev">V:1, I:10</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/x/xutils-dev.html">1485</a>
                  </td>
                  <td style="text-align: left"><code class="literal">imake</code>(1), <code class="literal">xmkmf</code>(1), ecc.  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <br class="table-break"/>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_make"/>12.6.1. Make</h3>
              </div>
            </div>
          </div>
          <p><a class="ulink" href="https://it.wikipedia.org/wiki/Make">Make</a> è un'utilità per mantenere gruppi di
programmi. Quando <code class="literal">make</code>(1) viene eseguito legge il file di
regole, "<code class="literal">Makefile</code>" e aggiorna il file target se dipende
da file prerequisiti che sono stati modificati dall'ultima volta che esso
stesso è stato modificato oppure se il file target non esiste. L'esecuzione
di questi aggiornamenti può avvenire in modo concorrente.</p>
          <p>La sintassi del file di regole è la seguente.</p>
          <pre class="screen">target: [ prerequisites ... ]
 [TAB]  command1
 [TAB]  -command2 # ignore errors
 [TAB]  @command3 # suppress echoing</pre>
          <p>Qui "<code class="literal">[TAB]</code> è il codice di TAB. Ciascuna riga è
interpretata dalla shell dopo la sostituzione delle variabili di make. Usare
"<code class="literal">\</code>" alla fine di una riga per continuare lo script. Usare
"<code class="literal">$$</code>" per inserire "<code class="literal">$</code>" per valori di
ambiente per uno script di shell.</p>
          <p>Regole implicite per il target ed i prerequisiti possono essere scritte, per
esempio, nel modo seguente.</p>
          <pre class="screen">%.o: %.c header.h</pre>
          <p>In questo caso il target contiene il carattere "<code class="literal">%</code>"
(esattamente un carattere). Il "<code class="literal">%</code>" fa corrispondenza con
qualsiasi sottostringa non vuota nei nomi di file dei target
effettivi. Similmente i prerequisiti usano "<code class="literal">%</code>" per
mostrare come i loro nomi trovino corrispondenza nei nomi dei target
effettivi.</p>
          <div class="table">
            <a id="listofmakeautomaticvariables"/>
            <p class="title">
              <strong>Tabella 12.17. Elenco di variabili automatiche di make</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di variabili automatiche di make" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> variabile automatica  </th>
                    <th style="text-align: left"> valore </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$@</code> </td>
                    <td style="text-align: left"> target </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$&lt;</code> </td>
                    <td style="text-align: left"> primo prerequisito </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$?</code> </td>
                    <td style="text-align: left"> tutti i prerequisiti più recenti </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$^</code> </td>
                    <td style="text-align: left"> tutti i prerequisiti </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">$*</code> </td>
                    <td style="text-align: left"> "<code class="literal">%</code>" nome base con corrispondenza con il modello target </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <div class="table">
            <a id="listofmakevariableexpansions"/>
            <p class="title">
              <strong>Tabella 12.18. Elenco di espansioni delle variabili di make</strong>
            </p>
            <div class="table-contents">
              <table class="table" summary="Elenco di espansioni delle variabili di make" border="1">
                <colgroup>
                  <col style="text-align: left"/>
                  <col style="text-align: left"/>
                </colgroup>
                <thead>
                  <tr>
                    <th style="text-align: left"> espansione di variabile </th>
                    <th style="text-align: left"> descrizione </th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: left"> <code class="literal">pippo1 := pluto</code> </td>
                    <td style="text-align: left"> espansione valida una volta sola </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">pippo2 = pluto</code> </td>
                    <td style="text-align: left"> espansione ricorsiva </td>
                  </tr>
                  <tr>
                    <td style="text-align: left"> <code class="literal">pippo3 += pluto</code> </td>
                    <td style="text-align: left"> accoda </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <br class="table-break"/>
          <p>Eseguire "<code class="literal">make -p -f/dev/null</code>" per vedere le regole
interne automatiche.</p>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_autotools"/>12.6.2. Autotools</h3>
              </div>
            </div>
          </div>
          <p><a class="ulink" href="https://en.wikipedia.org/wiki/GNU_Autotools">Autotools</a> è una suite di strumenti per
programmazione progettata per assistere nella creazione di pacchetti di
codice sorgente portabili su molti sistemi <a class="ulink" href="https://it.wikipedia.org/wiki/Unix-like">simil-UNIX</a>.</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p><a class="ulink" href="https://en.wikipedia.org/wiki/Autoconf">Autoconf</a> è uno strumento per produrre uno
script di shell chiamato "<code class="literal">configure</code>" da
"<code class="literal">configure.ac</code>".</p>
                <div class="itemizedlist">
                  <ul class="itemizedlist">
                    <li class="listitem">
                      <p>"<code class="literal">configure</code>" è successivamente usato per produrre
"<code class="literal">Makefile</code>" da un modello
"<code class="literal">Makefile.in</code>".</p>
                    </li>
                  </ul>
                </div>
              </li>
              <li class="listitem">
                <p><a class="ulink" href="https://en.wikipedia.org/wiki/Automake">Automake</a> è uno strumento per produrre
"<code class="literal">Makefile.in</code>" da "<code class="literal">Makefile.am</code>".</p>
              </li>
              <li class="listitem">
                <p><a class="ulink" href="https://en.wikipedia.org/wiki/GNU_Libtool">Libtool</a> è uno script di shell per affrontare
il problema della portabilità del software quando si compilano librerie
condivise da codice sorgente.</p>
              </li>
            </ul>
          </div>
          <div class="section">
            <div class="titlepage">
              <div>
                <div>
                  <h4 class="title"><a id="_compile_and_install_a_program"/>12.6.2.1. Compilare ed installare un programma</h4>
                </div>
              </div>
            </div>
            <div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
              <table border="0" summary="Warning">
                <tr>
                  <td rowspan="2" align="center" valign="top">
                    <img alt="[Avvertimento]" src="images/warning.png"/>
                  </td>
                  <th align="left">Avvertimento</th>
                </tr>
                <tr>
                  <td align="left" valign="top">
                    <p>Non sovrascrivere mai file di sistema quando si installano programmi
compilati in proprio.</p>
                  </td>
                </tr>
              </table>
            </div>
            <p>Debian non tocca i file in "<code class="literal">/usr/local/</code>" o
"<code class="literal">/opt</code>". Perciò se si compila un programma dai sorgenti,
installarlo in "<code class="literal">/usr/local/</code>" in modo che non interferisca
con Debian.</p>
            <pre class="screen">$ cd src
$ ./configure --prefix=/usr/local
$ make # this compiles program
$ sudo make install # this installs the files in the system</pre>
          </div>
          <div class="section">
            <div class="titlepage">
              <div>
                <div>
                  <h4 class="title"><a id="_uninstall_program"/>12.6.2.2. Disinstallare un programma</h4>
                </div>
              </div>
            </div>
            <p>Se si hanno i sorgenti originali e questi usano
<code class="literal">autoconf</code>(1)/<code class="literal">automake</code>(1), e se ci si
ricorda la configurazione usata, eseguire quanto segue per disinstallare un
programma.</p>
            <pre class="screen">$ ./configure <span class="emphasis"><em>all-of-the-options-you-gave-it</em></span>
$ sudo make uninstall</pre>
            <p>In alternativa, se si è assolutamente certi che il processo di installazione
mette i file solo in "<code class="literal">/usr/local/</code>" e lì non c'è nulla di
importante, si può cancellare tutto ciò che contiene con la riga di comando
seguente.</p>
            <pre class="screen"># find /usr/local -type f -print0 | xargs -0 rm -f</pre>
            <p>Se non si è sicuri di dove siano installati i file, si dovrebbe prendere in
considerazione l'uso di <code class="literal">checkinstall</code>(8) dal pacchetto
<code class="literal">checkinstall</code>, che fornisce un percorso di
disinstallazione pulita. Ora permette di creare un pacchetto Debian con
l'opzione "<code class="literal">-D</code>".</p>
          </div>
        </div>
        <div class="section">
          <div class="titlepage">
            <div>
              <div>
                <h3 class="title"><a id="_meson"/>12.6.3. Meson</h3>
              </div>
            </div>
          </div>
          <p>Il sistema di compilazione del software si sta evolvendo:</p>
          <div class="itemizedlist">
            <ul class="itemizedlist">
              <li class="listitem">
                <p> <a class="ulink" href="https://en.wikipedia.org/wiki/GNU_Autotools">Autotools</a> basato su <a class="ulink" href="https://it.wikipedia.org/wiki/Make">Make</a> è stato lo standard di fatto per le infrustrutture
di compilazione portabili sin dagli anni '90. È estremamente lento.</p>
              </li>
              <li class="listitem">
                <p> <a class="ulink" href="https://it.wikipedia.org/wiki/CMake">CMake</a> inizialmente rilasciato nel 2000 ha
migliorato significativamente la velocità, ma era ancora costruito sulla
base dell'intrinsicamente lento <a class="ulink" href="https://it.wikipedia.org/wiki/Make">Make</a>.</p>
              </li>
              <li class="listitem">
                <p> <a class="ulink" href="https://en.wikipedia.org/wiki/Ninja_(build_system)">Ninja</a> inizialmente rilasciato nel 2012 è
pensato per rimpiazzare Make per una velocità ulteriormente migliorata, ma è
anche progettato per avere i propri file di input generati da un sistema di
compilazione di più alto livello.</p>
              </li>
              <li class="listitem">
                <p> <a class="ulink" href="https://en.wikipedia.org/wiki/Meson_(software)">Meson</a> rilasciato inizialmente nel 2013 è il
nuovo popolare e veloce sistema di compilazione di più alto livello che usa
<a class="ulink" href="https://en.wikipedia.org/wiki/Ninja_(build_system)">Ninja</a> come suo backend.</p>
              </li>
            </ul>
          </div>
          <p>Vedere la documentazione in "<a class="ulink" href="https://mesonbuild.com/">The Meson
Build system</a>" e "<a class="ulink" href="https://ninja-build.org/manual.html">The Ninja build
system</a>".</p>
        </div>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_web"/>12.7. Web</h2>
            </div>
          </div>
        </div>
        <p>Pagine web dinamiche interattive di base possono essere create nel modo
seguente.</p>
        <div class="itemizedlist">
          <ul class="itemizedlist">
            <li class="listitem">
              <p> Le interrogazioni vengono presentate all'utente del browser usando moduli
<a class="ulink" href="https://it.wikipedia.org/wiki/Html">HTML</a>.  </p>
            </li>
            <li class="listitem">
              <p> La compilazione e il cliccare sulle voci nel modulo invia una delle stringhe
<a class="ulink" href="https://it.wikipedia.org/wiki/Uniform_Resource_Locator">URL</a> seguenti con i parametri codificati dal
browser al web server.  </p>
              <div class="itemizedlist">
                <ul class="itemizedlist">
                  <li class="listitem">
                    <p> "<code class="literal">http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&amp;VAR2=VAL2&amp;VAR3=VAL3</code>" </p>
                  </li>
                  <li class="listitem">
                    <p> "<code class="literal">http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&amp;VAR2=VAL2&amp;VAR3=VAL3</code>" </p>
                  </li>
                  <li class="listitem">
                    <p> "<code class="literal">http://www.foo.dom/program.php?VAR1=VAL1&amp;VAR2=VAL2&amp;VAR3=VAL3</code>" </p>
                  </li>
                </ul>
              </div>
            </li>
            <li class="listitem">
              <p> "<code class="literal">%nn</code>" nell'URL viene sostituito dal carattere con valore
esadecimale <code class="literal">nn</code>.  </p>
            </li>
            <li class="listitem">
              <p> Viene impostata la variabile d'ambiente: "<code class="literal">QUERY_STRING="VAR1=VAL1
VAR2=VAL2 VAR3=VAL3"</code>".  </p>
            </li>
            <li class="listitem">
              <p>Il programma <a class="ulink" href="https://it.wikipedia.org/wiki/Common_Gateway_Interface">CGI</a> (uno qualsiasi dei
"<code class="literal">program.*</code>") sul server web è eseguito con la variabile
d'ambiente "<code class="literal">$QUERY_STRING</code>".  </p>
            </li>
            <li class="listitem">
              <p>Lo <code class="literal">stdout</code> del programma CGI viene inviato al browser web
ed è presentato come pagina web dinamica interattiva.  </p>
            </li>
          </ul>
        </div>
        <p>Per ragioni di sicurezza è bene non creare a mano nuovi metodi per
analizzare i parametri CGI. Per loro esistono moduli Perl e Python
comprovati. <a class="ulink" href="https://it.wikipedia.org/wiki/PHP">PHP</a> è fornito con queste
funzionalità. Quando è necessaria l'archiviazione dei dati client vengono
usati i <a class="ulink" href="https://it.wikipedia.org/wiki/Cookie">cookie HTTP</a>. Quando è necessaria
l'elaborazione dei dati lato client, viene spesso usato <a class="ulink" href="https://it.wikipedia.org/wiki/JavaScript">Javascript</a>.</p>
        <p>Per maggiori informazioni vedere <a class="ulink" href="https://it.wikipedia.org/wiki/Common_Gateway_Interface">CGI
(Common Gateway Interface)</a>, <a class="ulink" href="https//it.wikipedia.org/wiki/Apache_Software_Foundation">Apache Software Foundation</a> e
<a class="ulink" href="https://it.wikipedia.org/wiki/JavaScript">JavaScript</a>.</p>
        <p>Cercare "CGI tutorial" su Google digitando l'URL codificato <a class="ulink" href="http://www.google.com/search?hl=it&amp;ie=UTF-8&amp;q=CGI+tutorial">http://www.google.com/search?hl=en&amp;ie=UTF-8&amp;q=CGI+tutorial</a>
direttamente nell'indirizzo del browser è un buon modo per vedere lo script
CGI in azione sul server di Google.</p>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_the_source_code_translation"/>12.8. Traduzione di codice sorgente</h2>
            </div>
          </div>
        </div>
        <p>Esistono programmi per convertire codice sorgente.</p>
        <div class="table">
          <a id="listofsourcecodetranslationtools"/>
          <p class="title">
            <strong>Tabella 12.19. Elenco di strumenti per la traduzione di codice sorgente</strong>
          </p>
          <div class="table-contents">
            <table class="table" summary="Elenco di strumenti per la traduzione di codice sorgente" border="1">
              <colgroup>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
                <col style="text-align: left"/>
              </colgroup>
              <thead>
                <tr>
                  <th style="text-align: left"> pacchetto </th>
                  <th style="text-align: left"> popcon </th>
                  <th style="text-align: left"> dimensione </th>
                  <th style="text-align: left"> parola chiave </th>
                  <th style="text-align: left"> descrizione </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/perl"> <code class="literal">perl</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=perl">V:644, I:990</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/p/perl.html">669</a>
                  </td>
                  <td style="text-align: left"> AWK→PERL </td>
                  <td style="text-align: left"> converte codice sorgente da AWK a PERL:<code class="literal">a2p</code>(1) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/f2c"> <code class="literal">f2c</code>
</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=f2c">V:0, I:4</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/f/f2c.html">442</a>
                  </td>
                  <td style="text-align: left"> FORTRAN→C </td>
                  <td style="text-align: left"> converte codice sorgente da FORTRAN 77 a C/C++: <code class="literal">f2c</code>(1) </td>
                </tr>
                <tr>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.debian.org/sid/intel2gas">
<code class="literal">intel2gas</code> </a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=intel2gas">V:0, I:0</a>
                  </td>
                  <td style="text-align: left">
                    <a class="ulink" href="http://packages.qa.debian.org/i/intel2gas.html">178</a>
                  </td>
                  <td style="text-align: left"> intel→gas </td>
                  <td style="text-align: left"> convertitore da NASM (formato Intel) a GAS (GNU Assembler) </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
        <br class="table-break"/>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="_making_debian_package"/>12.9. Creare pacchetti Debian</h2>
            </div>
          </div>
        </div>
        <p>Se si desidera creare un pacchetto Debian, leggere i documenti seguenti.</p>
        <div class="itemizedlist">
          <ul class="itemizedlist">
            <li class="listitem">
              <p><a class="xref" href="ch02.it.html" title="Capitolo 2. Gestione dei pacchetti in Debian">Capitolo 2, <em>Gestione dei pacchetti in Debian</em></a> per capire le basi del sistema
dei pacchetti </p>
            </li>
            <li class="listitem">
              <p><a class="xref" href="ch02.it.html#_porting_a_package_to_the_stable_system" title="2.7.13. Fare il port di un pacchetto nel sistema stabile">Sezione 2.7.13, «Fare il port di un pacchetto nel sistema stabile»</a> per capire le basi
del processo di port </p>
            </li>
            <li class="listitem">
              <p><a class="xref" href="ch09.it.html#_chroot_system" title="9.11.4. Sistema chroot">Sezione 9.11.4, «Sistema chroot»</a> per capire le basi delle tecniche chroot </p>
            </li>
            <li class="listitem">
              <p><code class="literal">debuild</code>(1) e <code class="literal">sbuild</code>(1) </p>
            </li>
            <li class="listitem">
              <p><a class="xref" href="ch12.it.html#_debugging_the_debian_package" title="12.5.2. Fare il debug di pacchetti Debian">Sezione 12.5.2, «Fare il debug di pacchetti Debian»</a> per la ricompilazione per il
debug </p>
            </li>
            <li class="listitem">
              <p><a class="ulink" href="https://www.debian.org/doc/manuals/debmake-doc/">Guide for Debian
Maintainers</a> (il pacchetto <code class="literal">debmake-doc</code>) </p>
            </li>
            <li class="listitem">
              <p><a class="ulink" href="https://www.debian.org/doc/manuals/developers-reference/">Debian Developer's
Reference</a> (pacchetto <code class="literal">developers-reference</code>) </p>
            </li>
            <li class="listitem">
              <p><a class="ulink" href="https://www.debian.org/doc/debian-policy/">Manuale Debian Policyl</a> (pacchetto
<code class="literal">debian-policy</code>) </p>
            </li>
          </ul>
        </div>
        <p>Ci sono pacchetti come <code class="literal">debmake</code>,
<code class="literal">dh-make</code>, <code class="literal">dh-make-perl</code>, ecc., che
aiutano nella creazione dei pacchetti.</p>
      </div>
    </div>
    <div class="navfooter">
      <hr/>
      <table width="100%" summary="Navigation footer">
        <tr>
          <td align="left"><a accesskey="p" href="ch11.it.html"><img src="images/prev.png" alt="Indietro"/></a> </td>
          <td align="center"> </td>
          <td align="right"> <a accesskey="n" href="apa.it.html"><img src="images/next.png" alt="Avanti"/></a></td>
        </tr>
        <tr>
          <td align="left" valign="top">Capitolo 11. Conversione di dati </td>
          <td align="center">
            <a accesskey="h" href="index.it.html">
              <img src="images/home.png" alt="Partenza"/>
            </a>
          </td>
          <td align="right" valign="top"> Appendice A. Appendice</td>
        </tr>
      </table>
    </div>
  </body>
</html>