| Current Path : /proc/thread-self/root/usr/share/debian-reference/ |
| Current File : //proc/thread-self/root/usr/share/debian-reference/ch01.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 1. Tutorial GNU/Linux</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="pr01.it.html" title="Prefazione"/>
<link rel="next" href="ch02.it.html" title="Capitolo 2. Gestione dei pacchetti in Debian"/>
</head>
<body>
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Capitolo 1. Tutorial GNU/Linux</th>
</tr>
<tr>
<td align="left"><a accesskey="p" href="pr01.it.html"><img src="images/prev.png" alt="Indietro"/></a> </td>
<th width="60%" align="center"> </th>
<td align="right"> <a accesskey="n" href="ch02.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="_gnu_linux_tutorials"/>Capitolo 1. Tutorial GNU/Linux</h1>
</div>
</div>
</div>
<div class="toc">
<p>
<strong>Indice</strong>
</p>
<dl class="toc">
<dt>
<span class="section">
<a href="ch01.it.html#_console_basics">1.1. Nozioni di base sulla console</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="section">
<a href="ch01.it.html#_the_shell_prompt">1.1.1. Il prompt di shell</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_shell_prompt_under_gui">1.1.2. Il prompt di shell in una GUI</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_root_account">1.1.3. L'account root</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_root_shell_prompt">1.1.4. Il prompt di shell di root</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_gui_system_administration_tools">1.1.5. Strumenti di amministrazione del sistema con interfaccia utente grafica</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_virtual_consoles">1.1.6. Console virtuali</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_how_to_leave_the_command_prompt">1.1.7. Come uscire dal prompt dei comandi</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_how_to_shutdown_the_system">1.1.8. Come spegnere il sistema</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_recovering_a_sane_console">1.1.9. Ripristinare una console funzionante</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_additional_package_suggestions_for_the_newbie">1.1.10. Suggerimenti per pacchetti aggiuntivi per i principianti</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_an_extra_user_account">1.1.11. Un account utente extra</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_sudo_configuration">1.1.12. Configurazione di sudo</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_play_time">1.1.13. Tempo di giocare</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="section">
<a href="ch01.it.html#_unix_like_filesystem">1.2. File system stile Unix</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="section">
<a href="ch01.it.html#_unix_file_basics">1.2.1. Nozioni di base sui file Unix</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_filesystem_internals">1.2.2. Aspetti tecnici del file system</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_filesystem_permissions">1.2.3. Permessi del file system</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_control_of_permissions_for_newly_created_files_umask">1.2.4. Controllo dei permessi per i file appena creati: umask</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_permissions_for_groups_of_users_group">1.2.5. Permessi per gruppi di utenti (gruppi)</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_timestamps">1.2.6. Orari</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_links">1.2.7. Collegamenti</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_named_pipes_fifos">1.2.8. Pipe con nome (FIFO)</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_sockets">1.2.9. Socket</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_device_files">1.2.10. File di device</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_special_device_files">1.2.11. File di device speciali</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_procfs_and_sysfs">1.2.12. procfs e sysfs</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_tmpfs">1.2.13. tmpfs</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="section">
<a href="ch01.it.html#_midnight_commander_mc">1.3. Midnight Commander (MC)</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="section">
<a href="ch01.it.html#_customization_of_mc">1.3.1. Personalizzazione di MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_starting_mc">1.3.2. Avvio di MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_file_manager_in_mc">1.3.3. Gestore dei file in MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_command_line_tricks_in_mc">1.3.4. Trucchetti per la riga di comando di MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_internal_editor_in_mc">1.3.5. L'editor interno di MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_internal_viewer_in_mc">1.3.6. Il visualizzatore interno di MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_auto_start_features_of_mc">1.3.7. Funzionalità di avvio automatico di MC</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_virtual_filesystem_of_mc">1.3.8. File system virtuale di MC</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="section">
<a href="ch01.it.html#_the_basic_unix_like_work_environment">1.4. Ambiente di lavoro di base in stile Unix</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="section">
<a href="ch01.it.html#_the_login_shell">1.4.1. La shell di login</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_customizing_bash">1.4.2. Personalizzare bash</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_special_key_strokes">1.4.3. Associazioni di tasti speciali</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_mouse_operations">1.4.4. Operazioni del mouse</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_pager">1.4.5. Il paginatore</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_text_editor">1.4.6. L'editor di testo</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_setting_a_default_text_editor">1.4.7. Impostare un editor di testi predefinito</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_using_vim">1.4.8. Usare vim</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_recording_the_shell_activities">1.4.9. Registrare le attività della shell</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_basic_unix_commands">1.4.10. Comandi Unix di base</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="section">
<a href="ch01.it.html#_the_simple_shell_command">1.5. Il semplice comando di shell</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="section">
<a href="ch01.it.html#_command_execution_and_environment_variable">1.5.1. Esecuzione dei comandi e variabili d'ambiente</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_literal_lang_literal_variable">1.5.2. La variabile "<code class="literal">$LANG</code>"</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_literal_path_literal_variable">1.5.3. La variabile "<code class="literal">$PATH</code>"</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_the_literal_home_literal_variable">1.5.4. La variabile "<code class="literal">$HOME</code>"</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_command_line_options">1.5.5. Opzioni della riga di comando</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_shell_glob">1.5.6. Glob della shell</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_return_value_of_the_command">1.5.7. Valore restituito dal comando</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_typical_command_sequences_and_shell_redirection">1.5.8. Sequenze tipiche di comandi e ridirezione della shell</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_command_alias">1.5.9. Alias di comandi</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="section">
<a href="ch01.it.html#_unix_like_text_processing">1.6. Elaborazione di testo stile Unix</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="section">
<a href="ch01.it.html#_unix_text_tools">1.6.1. Strumenti Unix per il testo</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_regular_expressions">1.6.2. Espressioni regolari</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_replacement_expressions">1.6.3. Espressioni di sostituzione</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_global_substitution_with_regular_expressions">1.6.4. Sostituzione globale con espressioni regolari</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_extracting_data_from_text_file_table">1.6.5. Estrarre dati da file con tabelle di testo</a>
</span>
</dt>
<dt>
<span class="section">
<a href="ch01.it.html#_script_snippets_for_piping_commands">1.6.6. Frammenti di script per comandi con pipe</a>
</span>
</dt>
</dl>
</dd>
</dl>
</div>
<p>Penso che imparare un sistema informatico sia come imparare una lingua
straniera. Anche se le guide e la documentazione sono utili, si deve fare
pratica diretta. Per aiutare il lettore a iniziare dolcemente, ho elaborato
alcuni punti base.</p>
<p>Il potente design di <a class="ulink" href="https://www.debian.org">Debian</a> <a class="ulink" href="https://en.wikipedia.org/wiki/GNU">GNU</a>/<a class="ulink" href="https://it.wikipedia.org/wiki/Linux">Linux</a> deriva dal
sistema operativo <a class="ulink" href="https://it.wikipedia.org/wiki/Unix">Unix</a>, cioè un sistema
operativo <a class="ulink" href="https://en.wikipedia.org/wiki/Multi-user">multiutente</a> e <a class="ulink" href="https://it.wikipedia.org/wiki/Multitasking">multitasking</a>. Bisogna imparare a sfruttare la
potenza di queste caratteristiche e le somiglianze tra Unix e GNU/Linux.</p>
<p>Non bisogna scappare dai testi pensati per Unix e affidarsi solamente a
testi su GNU/Linux dato che in questo modo ci si priva di molte informazioni
utili.</p>
<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>Se si è usato tramite strumenti a riga di comando un sistema <a class="ulink" href="https://it.wikipedia.org/wiki/Unix-like">*nix</a> per un certo tempo, probabilmente si sa già
tutto ciò che viene spiegato qui. Si usi questa sezione come un ripasso e
per consultazioni.</p>
</td>
</tr>
</table>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="_console_basics"/>1.1. Nozioni di base sulla console</h2>
</div>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_shell_prompt"/>1.1.1. Il prompt di shell</h3>
</div>
</div>
</div>
<p>All'avvio del sistema, se non è stata installato alcun ambiente con <a class="ulink" href="https://it.wikipedia.org/wiki/Interfaccia_grafica">GUI</a> come il sistema desktop <a class="ulink" href="https://it.wikipedia.org/wiki/GNOME">GNOME</a> o <a class="ulink" href="https://it.wikipedia.org/wiki/KDE">KDE</a>. Supponiamo che
il proprio nome host sia <code class="literal">pippo</code>, il prompt di login
apparirà come segue.</p>
<p>Se è stato installato un ambiente <a class="ulink" href="https://it.wikipedia.org/wiki/Interfaccia_grafica">GUI</a>, allora ci
si può comunque spostare ad un prompt di login a caratteri premendo
Ctrl-Alt-F3 e si può ritornare alla GUI con Ctrl-Alt-F2 (vedere <a class="xref" href="ch01.it.html#_virtual_consoles" title="1.1.6. Console virtuali">Sezione 1.1.6, «Console virtuali»</a> in seguito per maggiori informazioni).</p>
<pre class="screen">foo login:</pre>
<p>Al prompt di login digitare il proprio nome utente, ad esempio
<code class="literal">pinguino</code> e premere il tasto Invio, poi digitare la
propria password e premere di nuovo Invio.</p>
<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>Nella tradizione Unix, il nome utente e la password di un sistema Debian
distinguono le lettere maiuscole dalle minuscole. Il nome utente di solito
viene scelto usando solo lettere minuscole. Il primo account utente viene
normalmente creato durante l'installazione. Account utente aggiuntivi
possono essere creati da root con <code class="literal">adduser</code>(8).</p>
</td>
</tr>
</table>
</div>
<p>Il sistema si presenta con il messaggio di benvenuto memorizzato in
"<code class="literal">/etc/motd</code>" (Message Of The Day, messaggio del giorno) e
fornisce un prompt dei comandi.</p>
<pre class="screen">Debian GNU/Linux 11 foo tty1
foo login: penguin
Password:
Linux foo 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu May 13 08:47:13 JST 2021 on tty1
foo:~$</pre>
<p>Si è ora nella <a class="ulink" href="https://it.wikipedia.org/wiki/Shell_(informatica)">shell</a>. La shell interpreta i
comandi dell'utente.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_shell_prompt_under_gui"/>1.1.2. Il prompt di shell in una GUI</h3>
</div>
</div>
</div>
<p>Se è stato installato un ambiente con <a class="ulink" href="https://it.wikipedia.org/wiki/Interfaccia_grafica">GUI</a> durante
l'installazione, all'avvio del sistema viene presentata una schermata
grafica di login. Si inseriscono il nome utente e la password per fare il
login come utente non privilegiato. Usare il tasto Tab per spostarsi dal
campo del nome utente a quello della password e viceversa, oppure usare il
mouse e il clic principale.</p>
<p>Si può ottenere il prompt di shell in un ambiente GUI avviando un programma
<code class="literal">emulatore di terminale X</code> come
<code class="literal">gnome-terminal</code>(1), <code class="literal">rxvt</code>(1) o
<code class="literal">xterm</code>(1). Nell'ambiente desktop GNOME può essere fatto
premendo il tasto SUPER (tasto Windows) e digitando "terminal" per cercare
il prompt.</p>
<p>In altri sistemi Desktop (come <code class="literal">fluxbox</code>), potrebbe non
esserci un punto evidente per l'apertura del menu. Se si è in questa
condizione, provare a fare clic, con il tasto destro, sullo sfondo della
schermata del desktop e sperare che appaia un menu.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_root_account"/>1.1.3. L'account root</h3>
</div>
</div>
</div>
<p>L'account root viene anche indicato come <a class="ulink" href="https://it.wikipedia.org/wiki/Superuser">superutente</a> o utente privilegiato. Da questo
account si possono eseguire i seguenti compiti amministrativi.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Leggere, scrivere e cancellare qualsiasi file sul sistema indipendentemente
dai suoi permessi. </p>
</li>
<li class="listitem">
<p> Impostare il proprietario e i permessi di qualunque file sul sistema. </p>
</li>
<li class="listitem">
<p> Impostare la password di qualsiasi utente non privilegiato nel sistema. </p>
</li>
<li class="listitem">
<p> Fare il login in qualsiasi account senza la password. </p>
</li>
</ul>
</div>
<p>Questi poteri illimitati dell'account root rendono necessario essere
prudenti e responsabili nel loro uso.</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 comunicare mai la password di root ad altri.</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>I permessi di un file (inclusi i device hardware come CD-ROM, ecc. che sono
nient'altro che un altro file per il sistema Debian) lo possono rendere
inutilizzabile o inaccessibile per gli utenti non root. Benché usare
l'account root sia un metodo veloce per affrontare questo tipo di
situazione, la sua soluzione dovrebbe essere l'impostazione degli
appropriati permessi e gruppi proprietari per il file (vedere <a class="xref" href="ch01.it.html#_filesystem_permissions" title="1.2.3. Permessi del file system">Sezione 1.2.3, «Permessi del file system»</a>).</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_root_shell_prompt"/>1.1.4. Il prompt di shell di root</h3>
</div>
</div>
</div>
<p>Ecco alcuni metodi di base per ottenere il prompt di shell per root usando
la password di root.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Inserire <code class="literal">root</code> al prompt di login a caratteri. </p>
</li>
<li class="listitem">
<p> Digitare "<code class="literal">su -l</code>" al prompt di shell di un utente
qualsiasi. </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> L'ambiente dell'utente attuale non viene in questo caso preservato. </p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p> Digitare "<code class="literal">su</code>" al prompt di shell di un utente qualsiasi. </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> L'ambiente dell'utente attuale viene in questo caso parzialmente preservato. </p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_gui_system_administration_tools"/>1.1.5. Strumenti di amministrazione del sistema con interfaccia utente grafica</h3>
</div>
</div>
</div>
<p>Quando il menu del desktop non avvia gli strumenti con interfaccia grafica
per l'amministrazione di sistema con i privilegi appropriati, si può
avviarli dal prompt di shell di root degli emulatori di terminale, quali
<code class="literal">gnome-terminal</code>(1), <code class="literal">rxvt</code>(1) o
<code class="literal">xterm</code>(1). Vedere <a class="xref" href="ch01.it.html#_the_root_shell_prompt" title="1.1.4. Il prompt di shell di root">Sezione 1.1.4, «Il prompt di shell di root»</a>
e <a class="xref" href="ch07.it.html#_x_server_connection" title="7.8. Connessione a server X">Sezione 7.8, «Connessione a server X»</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 avviare mai il gestore di sessioni/display manager della GUI
dall'account root inserendo <code class="literal">root</code> al prompt di un display
manager come <code class="literal">gdm3</code>(1).</p>
<p>Non eseguire mai in X Window programmi con interfaccia utente grafica non
fidati da remoto quando sono visualizzate informazioni critiche, dato che
potrebbero spiare lo schermo X.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_virtual_consoles"/>1.1.6. Console virtuali</h3>
</div>
</div>
</div>
<p>Nel sistema Debian standard, ci sono sei console a caratteri <a class="ulink" href="https://it.wikipedia.org/wiki/VT100">in stile VT100</a> disponibili tra cui ci si può
spostare per avviare una shell di comando direttamente sull'host Linux. A
meno che non si sia in un ambiente con interfaccia grafica, si può passare
da una console virtuale all'altra usando simultaneamente il
<code class="literal">tasto_Alt_sinistro</code> e uno dei tasti <code class="literal">F1</code>
— <code class="literal">F6</code>. Ogni console a caratteri permette un login
indipendente nell'account e offre un ambiente multiutente. L'ambiente
multiutente è una bellissima caratteristica di Unix e ci si può abituare
presto a dipendere da esso.</p>
<p>Se si è nell'ambiente con GUI, si accede alla console a caratteri 3 premendo
i tasti <code class="literal">Ctrl-Alt-F3</code>, cioè premendo contemporaneamente il
<code class="literal">tasto_Ctrl_sinistro</code>, il
<code class="literal">tasto_Alt_sinistro</code> e il <code class="literal">tasto_F3</code>. Si
può tornare all'ambiente GUI, che di solito è in esecuzione sulla console
virtuale 2, premendo <code class="literal">Alt-F2</code>.</p>
<p>In alternativa ci si può spostare in un'altra console virtuale, per esempio
la console 3, dalla riga di comando.</p>
<pre class="screen"># chvt 3</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_how_to_leave_the_command_prompt"/>1.1.7. Come uscire dal prompt dei comandi</h3>
</div>
</div>
</div>
<p>Si digita <code class="literal">Ctrl-D</code>, cioè il
<code class="literal">tasto_Ctrl_sinistro</code> e il <code class="literal">tasto_d</code>
vengono premuti contemporaneamente al prompt dei comandi per chiuderà
l'attività della shell. Se si è nella console a caratteri, in questo modo si
ritorna al prompt di login. Anche se questi caratteri di controllo vengono
indicati con le lettere maiuscole, come "control D", non è necessario
premere il tasto Maiusc. Per indicare <code class="literal">Ctrl-D</code> viene anche
usata l'espressione abbreviata <code class="literal">^D</code>. In alternativa si può
digitare "exit".</p>
<p>In quest'ultimo modo, se si è in un emulatore di terminale
(<code class="literal">x-terminal-emulator</code>(1)), lo si può chiudere.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_how_to_shutdown_the_system"/>1.1.8. Come spegnere il sistema</h3>
</div>
</div>
</div>
<p>Esattamente come ogni altro SO moderno in cui le operazioni su file
comportano <a class="ulink" href="https://it.wikipedia.org/wiki/Cache">una cache dei dati</a> in memoria
per migliorare le prestazioni, il sistema Debian ha bisogno della
appropriata procedura di spegnimento prima che l'alimentazione possa essere
staccata in modo sicuro. Questo serve a preservare l'integrità dei file,
forzando la scrittura su disco di tutti i cambiamenti avvenuti in
memoria. Se è disponibile il controllo software dell'alimentazione, la
procedura di spegnimento automaticamente toglie l'alimentazione al
sistema. (In caso contrario può essere necessario tener premuto per alcuni
secondi il tasto di accensione/spegnimento.)</p>
<p>Si può spegnere il sistema dalla riga di comando nella normale modalità
multiutente.</p>
<pre class="screen"># shutdown -h now</pre>
<p>Si può spegnere il sistema dalla riga di comando nella modalità single-user.</p>
<pre class="screen"># poweroff -i -f</pre>
<p>Vedere <a class="xref" href="ch06.it.html#_how_to_shutdown_the_remote_system_on_ssh" title="6.3.8. Spegnere il sistema remoto su SSH">Sezione 6.3.8, «Spegnere il sistema remoto su SSH»</a>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_recovering_a_sane_console"/>1.1.9. Ripristinare una console funzionante</h3>
</div>
</div>
</div>
<p>Quando, dopo aver fatto qualcosa di strano come "<code class="literal">cat
<span class="emphasis"><em>un-qualche-file-binario</em></span></code>", lo schermo
impazzisce digitare "<code class="literal">reset</code>" al prompt dei comandi. Mentre
lo si digita il comando potrebbe non essere visualizzato. Si può anche usare
"<code class="literal">clear</code>" per pulire lo schermo.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_additional_package_suggestions_for_the_newbie"/>1.1.10. Suggerimenti per pacchetti aggiuntivi per i principianti</h3>
</div>
</div>
</div>
<p>Sebbene anche l'installazione minima del sistema Debian, senza alcun
ambiente desktop, fornisca le funzionalità Unix di base è una buona idea
installare con <code class="literal">apt-get</code>(8) alcuni pacchetti aggiuntivi per
la riga di comando e i terminali a caratteri basati su curses, come
<code class="literal">mc</code> e <code class="literal">vim</code> con cui i principianti
possono fare i primi passi. Eseguire i comandi seguenti.</p>
<pre class="screen"># apt-get update
...
# apt-get install mc vim sudo aptitude
...</pre>
<p>Se questi pacchetti sono già installati, nessun nuovo pacchetto sarà
installato.</p>
<div class="table">
<a id="listofinterestineprogrampackages"/>
<p class="title">
<strong>Tabella 1.1. Elenco di pacchetti con interessanti programmi in modalità testuale</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di pacchetti con interessanti programmi in modalità testuale" 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/mc"> <code class="literal">mc</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=mc">V:54, I:226</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/m/mc.html">1482</a>
</td>
<td style="text-align: left"> Gestore di file testuale a tutto schermo </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/sudo"> <code class="literal">sudo</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=sudo">V:638, I:823</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/s/sudo.html">5990</a>
</td>
<td style="text-align: left"> Programma per garantire privilegi di root limitati agli utenti </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/vim"> <code class="literal">vim</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=vim">V:97, I:390</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/v/vim.html">3570</a>
</td>
<td style="text-align: left"> Editor di testi Unix Vi IMproved, un editor di testi per programmatori
(versione standard) </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/vim-tiny">
<code class="literal">vim-tiny</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=vim-tiny">V:55, I:971</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/v/vim-tiny.html">1660</a>
</td>
<td style="text-align: left"> Editor di testi Unix Vi IMproved, un editor di testi per programmatori
(versione compatta) </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/emacs-nox">
<code class="literal">emacs-nox</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=emacs-nox">V:3, I:18</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/e/emacs-nox.html">33819</a>
</td>
<td style="text-align: left"> Emacs dal progetto GNU, l'editor di testi estensibile basato su Lisp </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/w3m"> <code class="literal">w3m</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=w3m">V:14, I:190</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/w/w3m.html">2828</a>
</td>
<td style="text-align: left"> Browser Web testuali </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/gpm"> <code class="literal">gpm</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=gpm">V:11, I:14</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/g/gpm.html">521</a>
</td>
<td style="text-align: left"> Taglia e Incolla in stile Unix nella console testuale (demone) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Potrebbe essere una buona idea leggere un po' di documentazione.</p>
<div class="table">
<a id="listofinformativentationpackages"/>
<p class="title">
<strong>Tabella 1.2. Elenco di pacchetti con documentazione interessante</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di pacchetti con documentazione interessante" 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/doc-debian">
<code class="literal">doc-debian</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=doc-debian">I:853</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/d/doc-debian.html">166</a>
</td>
<td style="text-align: left"> Documentazione del Progetto Debian, (FAQ Debian) ed altri documenti </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/debian-policy">
<code class="literal">debian-policy</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=debian-policy">I:21</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/d/debian-policy.html">4379</a>
</td>
<td style="text-align: left"> Manuale Debian Policy e documenti correlati </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/developers-reference">
<code class="literal">developers-reference</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=developers-reference">V:0, I:6</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/d/developers-reference.html">2051</a>
</td>
<td style="text-align: left"> Linee guida ed informazioni per gli sviluppatori Debian </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/debmake-doc">
<code class="literal">debmake-doc</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=debmake-doc">I:0</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/d/debmake-doc.html">11992</a>
</td>
<td style="text-align: left"> Guida Debian per il Manutentore </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/debian-history">
<code class="literal">debian-history</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=debian-history">I:0</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/d/debian-history.html">4302</a>
</td>
<td style="text-align: left"> Storia del Progetto Debian </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/debian-faq">
<code class="literal">debian-faq</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=debian-faq">I:850</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/d/debian-faq.html">790</a>
</td>
<td style="text-align: left"> FAQ Debian </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Si possono installare alcuni di questi pacchetti usando i comandi seguenti.</p>
<pre class="screen"># apt-get install package_name</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_an_extra_user_account"/>1.1.11. Un account utente extra</h3>
</div>
</div>
</div>
<p>Se non si vuole usare il proprio account utente principale per le
esercitazioni descritte in seguito, si può creare un account utente per
esercitarsi, ad esempio <code class="literal">pesce</code> con il comando seguente.</p>
<pre class="screen"># adduser fish</pre>
<p>Rispondere a tutte le domande.</p>
<p>In questo modo si crea un nuovo account chiamato
<code class="literal">pesce</code>. Dopo aver fatto pratica si può rimuover questo
account e la sua directory home digitando quanto segue.</p>
<pre class="screen"># deluser --remove-home fish</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_sudo_configuration"/>1.1.12. Configurazione di sudo</h3>
</div>
</div>
</div>
<p>Per la tipica postazione di lavoro di un unico utente, come il sistema
desktop Debian su un PC portatile, è frequente l'uso di una semplice
configurazione di <code class="literal">sudo</code>(8), come qui di seguito descritto,
per permettere all'utente non privilegiato, ad esempio
<code class="literal">pinguino</code>, di ottenere privilegi di amministratore con la
sola propria password, senza quella dell'utente root.</p>
<pre class="screen"># echo "penguin ALL=(ALL) ALL" >> /etc/sudoers</pre>
<p>In alternativa è uso comune usare la configurazione seguente per permettere
all'utente non privilegiato, ad esempio <code class="literal">pinguino</code>, di
ottenere privilegi di amministratore senza alcuna password.</p>
<pre class="screen"># echo "penguin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers</pre>
<p>Questo trucco dovrebbe essere usato esclusivamente per le postazioni di
lavoro con un solo utente, in cui l'utente è anche l'amministratore.</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 impostare account per utenti regolari su postazioni di lavoro
multi-utente in questo modo perché ciò sarebbe un grosso problema per la
sicurezza del sistema.</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>Nell'esempio precedente la password e l'account di
<code class="literal">pinguino</code> richiedono altrettanta protezione della password
e account dell'utente root.</p>
<p>I privilegi di amministrazione in questo contesto sono forniti a qualcuno
che è autorizzato ad eseguire i compiti di amministrazione del sistema sulla
macchina. Non dare mai tali privilegi ad un manager del dipartimento di
Amministrazione della propria azienda o al proprio capo, a meno che non
siano autorizzati e capaci.</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>Per fornire privilegi di accesso a specifici device e file, si dovrebbe
considerare l'uso dei <span class="strong"><strong>gruppi</strong></span> per dare un
accesso limitato, invece di usare i privilegi di <code class="literal">root</code>
attraverso <code class="literal">sudo</code>(8).</p>
<p>Con una configurazione più attenta e precisa, <code class="literal">sudo</code>(8) può
garantire privilegi amministrativi limitati ad altri utenti in un sistema
condiviso, senza rendere nota la password di root. Questo può aiutare la
tracciabilità su host con più di un amministratore, in modo che si possa
dire chi ha fatto cosa. D'altra parte si potrebbe anche volere che nessuno
abbia tali privilegi.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_play_time"/>1.1.13. Tempo di giocare</h3>
</div>
</div>
</div>
<p>Si è ora pronti a giocare con il sistema Debian senza rischi fintanto che si
usa l'account utente non privilegiato.</p>
<p>Ciò è possibile perché il sistema Debian è, anche subito dopo
l'installazione predefinita, configurato con i permessi dei file corretti
che impediscono agli utenti non privilegiati di danneggiare il sistema. Ci
possono essere naturalmente ancora dei punti deboli che possono essere
sfruttati, ma chi si preoccupa di tali cose non dovrebbe leggere questa
sezione ma piuttosto il manuale <a class="ulink" href="https://www.debian.org/doc/manuals/securing-debian-howto/">Securing
Debian</a>.</p>
<p>Si può imparare il sistema Debian, come sistema <a class="ulink" href="https://it.wikipedia.org/wiki/Unix-like">*nix</a> nelle sezioni seguenti.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><a class="xref" href="ch01.it.html#_unix_like_filesystem" title="1.2. File system stile Unix">Sezione 1.2, «File system stile Unix»</a> (concetti di base) </p>
</li>
<li class="listitem">
<p><a class="xref" href="ch01.it.html#_midnight_commander_mc" title="1.3. Midnight Commander (MC)">Sezione 1.3, «Midnight Commander (MC)»</a> (sopravvivere) </p>
</li>
<li class="listitem">
<p><a class="xref" href="ch01.it.html#_the_basic_unix_like_work_environment" title="1.4. Ambiente di lavoro di base in stile Unix">Sezione 1.4, «Ambiente di lavoro di base in stile Unix»</a> (lavoro di base) </p>
</li>
<li class="listitem">
<p><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> (uso della shell) </p>
</li>
<li class="listitem">
<p><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> (elaborazione di testi) </p>
</li>
</ul>
</div>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="_unix_like_filesystem"/>1.2. File system stile Unix</h2>
</div>
</div>
</div>
<p>In GNU/Linux ed altri sistemi operativi <a class="ulink" href="https://it.wikipedia.org/wiki/Unix-like">*nix</a>, i <a class="ulink" href="https://it.wikipedia.org/wiki/File">file</a> sono
organizzati in <a class="ulink" href="https://it.wikipedia.org/wiki/Directory">directory</a>. Tutti i file e
le directory sono organizzati in un unico grande albero che ha la sua radice
in "<code class="literal">/</code>". Viene chiamato albero perché il file system, se
viene disegnato, ha l'aspetto di un albero messo però sottosopra.</p>
<p>Questi file e directory possono essere sparsi su diversi
dispositivi. <code class="literal">mount</code>(8) serve per attaccare il file system
trovato su un qualche dispositivo al grande albero dei file. Al contrario,
<code class="literal">umount</code>(8) lo stacca. Nei kernel Linux recenti
<code class="literal">mount</code>(8) con alcune opzioni può collegare parte di un
albero dei file in qualche altra posizione o può montare file system come
condivisi, privati, slave o non-collegabili. Le opzioni di montaggio
supportate per ciascun file system sono disponibili in
"<code class="literal">/usr/share/doc/linux-doc-*/Documentation/filesystems/</code>".</p>
<p>Nei sistemi Unix vengono chiamate <span class="strong"><strong>directory</strong></span> quelle che in altri sistemi sono chiamate
<span class="strong"><strong>cartelle</strong></span>. Notare anche che non esiste in
nessun sistema Unix un concetto di <span class="strong"><strong>unità</strong></span>,
come "<code class="literal">A:</code>". C'è un solo unico file system e tutto vi è
incluso. Questo è un grandissimo vantaggio rispetto a Windows.</p>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_unix_file_basics"/>1.2.1. Nozioni di base sui file Unix</h3>
</div>
</div>
</div>
<p>Ecco alcune nozioni di base sui file Unix.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Nei nomi dei file si distingue tra <span class="strong"><strong>maiuscole e
minuscole</strong></span>. I file "<code class="literal">MIOFILE</code>" e
"<code class="literal">MioFile</code>" sono cioè file diversi. </p>
</li>
<li class="listitem">
<p> La <span class="strong"><strong>directory root</strong></span> indica la radice del
file system, indicata semplicemente con "<code class="literal">/</code>". Non la si
confonda con la directory home dell'utente root: "<code class="literal">/root</code>". </p>
</li>
<li class="listitem">
<p> Ogni directory ha un nome che può contenere qualsiasi lettera o simbolo
<span class="strong"><strong>tranne"<code class="literal">/</code>"</strong></span>. La
directory radice è un'eccezione; il suo nome è "<code class="literal">/</code>"
(pronunciato "slash" o "directory root/radice") e il suo nome non può essere
cambiato. </p>
</li>
<li class="listitem">
<p> Ogni file o directory è indicato da un <span class="strong"><strong>nome di file
pienamente qualificato</strong></span>, un <span class="strong"><strong>nome file
assoluto</strong></span> o un <span class="strong"><strong>percorso</strong></span>,
fornendo la sequenza di directory attraverso le quali si deve passare per
raggiungerlo. I tre termini sono sinonimi. </p>
</li>
<li class="listitem">
<p> Tutti i <span class="strong"><strong>nomi di file pienamente
qualificati</strong></span> iniziano con la directory "<code class="literal">/</code>" e
c'è un carattere "<code class="literal">/</code>" tra ciascuna directory o file nel
nome del file. Il primo carattere "<code class="literal">/</code>" è la directory di
più alto livello e gli altri "<code class="literal">/</code>" separano le directory
successive fino a che non si raggiunge l'ultima voce che è il nome del file
stesso. I termini usati possono creare confusione. Prendere in
considerazione come esempio il seguente <span class="strong"><strong>nome file
pienamente qualificato</strong></span> come esempio:
"<code class="literal">/usr/share/keytables/us.map.gz</code>"; anche se ci si
riferisce al solo nome base, "<code class="literal">us.map.gz</code>" come al suo
nome file. </p>
</li>
<li class="listitem">
<p> La directory radice ha un certo numero di rami, come
"<code class="literal">/etc/</code>" e "<code class="literal">/usr/</code>". Queste
sottodirectory a loro volta si diramano in ulteriori sottodirectory, come
"<code class="literal">/etc/init.d/</code>" e "<code class="literal">/usr/local/</code>". Viste
tutte insieme vengono chiamate <span class="strong"><strong>albero delle
directory</strong></span>. Si può pensare ad un nome file assoluto come ad un
percorso dalla base dell'albero ("<code class="literal">/</code>") alla punta di un
ramo (un file). Si può anche sentir parlare dell'albero delle directory come
se fosse un albero <span class="strong"><strong>genealogico</strong></span> che
comprende tutti i discendenti di un'unica figura detta directory radice
("<code class="literal">/</code>): le sottodirectory hanno perciò dei <span class="strong"><strong>genitori</strong></span> e un percorso mostra gli antenati completi
di un file. Ci sono anche percorsi relativi che iniziano da una qualche
posizione che non sia la directory radice. Si dovrebbe tenere a mente che la
directory "<code class="literal">../</code>" si riferisce alla directory
genitore. Questa terminologia si applica anche ad altre strutture simili a
quella delle directory, come le strutture di dati gerarchici. </p>
</li>
<li class="listitem">
<p> Non c'è alcun nome speciale di percorso di directory che corrisponda ad un
dispositivo fisico, come il disco fisso. Questa è una differenza rispetto a
<a class="ulink" href="https://it.wikipedia.org/wiki/RT-11">RT-11</a>, <a class="ulink" href="https://it.wikipedia.org/wiki/CP/M">CP/M</a>, <a class="ulink" href="https://it.wikipedia.org/wiki/OpenVMS">OpenVMS</a>, <a class="ulink" href="https://it.wikipedia.org/wiki/MS-DOS">MS-DOS</a>, <a class="ulink" href="https://it.wikipedia.org/wiki/AmigaOS">AmigaOS</a> e <a class="ulink" href="https://it.wikipedia.org/wiki/Microsoft_Windows">Microsoft
Windows</a>, in cui il percorso contiene una porzione con il nome di
dispositivo come "<code class="literal">C:\</code>". (Esistono tuttavia directory che
si riferiscono ai dispositivi fisici come a parte del file system
normale. Vedere <a class="xref" href="ch01.it.html#_filesystem_internals" title="1.2.2. Aspetti tecnici del file system">Sezione 1.2.2, «Aspetti tecnici del file system»</a>.) </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>Benché si <span class="strong"><strong>possa</strong></span> usare quasi qualsiasi
lettera o simbolo nel nome di un file, in pratica farlo non è una bella
idea. È meglio evitare qualsiasi carattere che ha spesso un significato
particolare sulla riga di comando, inclusi spazi, tabulazioni, a capo e
altri caratteri speciali: <code class="literal">{ } ( ) [ ] ' ` " \ / > < | ; ! #
& ^ * % @ $</code>. Se si vuole separare delle parole all'interno di
un nome file, buone alternative sono un punto, un trattino ed il segno di
sottolineatura. Si può anche scrivere in maiuscolo ogni parola,
"<code class="literal">InQuestoModo</code>". Gli utenti Linux esperti tendono ad
evitare l'uso degli spazi nei nomi dei file.</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>La parola "root" può significare l'"utente root" o la "directory root". Il
contesto in cui il termine viene usato dovrebbe rendere chiaro il suo
significato.</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>La parola <span class="strong"><strong>percorso</strong></span> non è usata solamente
per un <span class="strong"><strong>nome di file pienamente
qualificato</strong></span> come descritto in precedenza, ma anche per il
<span class="strong"><strong>percorso di ricerca dei comandi</strong></span>. Il
significato è di solito reso chiaro dal contesto.</p>
</td>
</tr>
</table>
</div>
<p>Le linee guida raccomandate per la gerarchia dei file sono descritte in
dettaglio nel Filesystem Hierarchy Standard
("<code class="literal">/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz</code>" e in
<code class="literal">hier</code>(7)). Come inizio si dovrebbe tenere a mente quanto
segue.</p>
<div class="table">
<a id="listofusageofkeydirectories"/>
<p class="title">
<strong>Tabella 1.3. Elenco degli usi delle directory principali</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco degli usi delle directory principali" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> directory </th>
<th style="text-align: left"> uso della directory </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">/</code> </td>
<td style="text-align: left"> la directory root </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/etc/</code> </td>
<td style="text-align: left"> file di configurazione a livello di sistema </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/var/log/</code> </td>
<td style="text-align: left"> file di registro del sistema </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/home/</code> </td>
<td style="text-align: left"> tutte le directory home degli utenti non privilegiati </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_filesystem_internals"/>1.2.2. Aspetti tecnici del file system</h3>
</div>
</div>
</div>
<p>Nella scia della <span class="strong"><strong>tradizione Unix</strong></span>, il
sistema Debian GNU/Linux fornisce il <a class="ulink" href="https://it.wikipedia.org/wiki/File_system">file
system</a> in cui risiedono i dati fisici nel disco fisso e negli altri
dispositivi di memorizzazione, ed inoltre le interazioni con i dispositivi
hardware come gli schermi delle console e le console seriali remote vengono
rappresentate in un modo unificato in "<code class="literal">/dev/</code>".</p>
<p>Ogni file, directory, pipe con nome (un modo per due programmi di scambiare
dati) o dispositivo fisico presente in un sistema Debian GNU/Linux ha una
struttura di dati chiamata <a class="ulink" href="https://it.wikipedia.org/wiki/Inode">inode</a> che descrive
gli attributi ad esso associati come l'utente che lo possiede
(proprietario), il gruppo a cui appartiene, la data dell'ultimo accesso ad
esso, ecc. L'idea di rappresentare praticamente tutto nel file system è
stata un'innovazione di Unix e i kernel Linux moderni hanno sviluppato
questa idea e sono andati oltre. Ora anche le informazioni sui processi in
esecuzione sul computer possono essere trovate nel file system.</p>
<p>La rappresentazione astratta e unificata di entità fisiche e di processi
interni è molto potente dato che permette di usare lo stesso comando per lo
stesso tipo di operazione su molti tipi di device completamente diversi
l'uno dall'altro. È anche possibile cambiare il modo in cui il kernel
funziona scrivendo dati in file speciali che sono collegati ai processi in
esecuzione.</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>Per identificare la corrispondenza tra l'albero dei file e le entità
fisiche, eseguire <code class="literal">mount</code>(8) senza opzioni.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_filesystem_permissions"/>1.2.3. Permessi del file system</h3>
</div>
</div>
</div>
<p>I <a class="ulink" href="https://it.wikipedia.org/wiki/Permessi_(Unix)">permessi del file system</a> di
sistemi <a class="ulink" href="https://it.wikipedia.org/wiki/Unix-like">*nix</a> sono definiti e influenzano tre
categorie di utenti.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> L'<span class="strong"><strong>utente</strong></span> che è il proprietario del file
(<span class="strong"><strong>u</strong></span>). </p>
</li>
<li class="listitem">
<p> Gli altri utenti del <span class="strong"><strong>gruppo</strong></span> a cui
appartiene il file (<span class="strong"><strong>g</strong></span>). </p>
</li>
<li class="listitem">
<p> Tutti gli <span class="strong"><strong>altri</strong></span>utenti (<span class="strong"><strong>o</strong></span>) a cui ci si riferisce anche con i termini
"mondo" e "tutti". </p>
</li>
</ul>
</div>
<p>Per un file, a ciascun permesso corrispondono le seguenti azioni.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Il permesso di <span class="strong"><strong>lettura</strong></span> (<span class="strong"><strong>r</strong></span>) permette al proprietario di esaminare il
contenuto del file. </p>
</li>
<li class="listitem">
<p> Il permesso di <span class="strong"><strong>scrittura</strong></span> (<span class="strong"><strong>w</strong></span>) permette al proprietario di modificare il file. </p>
</li>
<li class="listitem">
<p> Il permesso di <span class="strong"><strong>esecuzione</strong></span> (<span class="strong"><strong>x</strong></span>) permette al proprietario di eseguire il file
come comando. </p>
</li>
</ul>
</div>
<p>Per una directory, a ciascun permesso corrispondono le seguenti azioni.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Il permesso di <span class="strong"><strong>lettura</strong></span> (<span class="strong"><strong>r</strong></span>) permette al proprietario di elencare il
contenuto della directory. </p>
</li>
<li class="listitem">
<p> Il permesso di <span class="strong"><strong>scrittura</strong></span> (<span class="strong"><strong>w</strong></span>) permette al proprietario di aggiungere o
rimuovere file dalla directory. </p>
</li>
<li class="listitem">
<p> Il permesso di <span class="strong"><strong>esecuzione</strong></span> (<span class="strong"><strong>x</strong></span>) permette al proprietario di accedere ai file
nella directory. </p>
</li>
</ul>
</div>
<p>In questo caso il permesso di <span class="strong"><strong>esecuzione</strong></span>
su una directory non solo significa poter leggere i file in quella directory
ma anche poterne vedere gli attributi, come la dimensione e la data di
modifica.</p>
<p>Per visualizzare le informazioni sui permessi (ed altro) di file e directory
si usa <code class="literal">ls</code>(1). Quando chiamato con l'opzione
"<code class="literal">-l</code>" mostra, nell'ordine elencato in seguito, le seguenti
informazioni.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><span class="strong"><strong>Tipo di file</strong></span> (primo carattere). </p>
</li>
<li class="listitem">
<p> <span class="strong"><strong>Permessi</strong></span> di accesso al file (nove
caratteri, tre ciascuno per utente, gruppo e altri, in questo ordine). </p>
</li>
<li class="listitem">
<p><span class="strong"><strong>Numero di collegamenti fisici</strong></span> al file. </p>
</li>
<li class="listitem">
<p> Nome dell'<span class="strong"><strong>utente</strong></span> proprietario del file. </p>
</li>
<li class="listitem">
<p> Nome del <span class="strong"><strong>gruppo</strong></span> a cui il file appartiene. </p>
</li>
<li class="listitem">
<p><span class="strong"><strong>Dimensione</strong></span> in caratteri (byte) del file. </p>
</li>
<li class="listitem">
<p><span class="strong"><strong>Data ed ora</strong></span> del file (mtime). </p>
</li>
<li class="listitem">
<p><span class="strong"><strong>Nome</strong></span> del file. </p>
</li>
</ul>
</div>
<div class="table">
<a id="listofthefirstchacteroflsloutput"/>
<p class="title">
<strong>Tabella 1.4. Elenco dei valori possibili per il primo carattere nell'output di
"<code class="literal">ls -l</code>"</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco dei valori possibili per il primo carattere nell'output di "ls -l"" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> carattere </th>
<th style="text-align: left"> significato </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">-</code> </td>
<td style="text-align: left"> file normale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">d</code> </td>
<td style="text-align: left"> directory </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">l</code> </td>
<td style="text-align: left"> collegamento simbolico </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">c</code> </td>
<td style="text-align: left"> device a caratteri </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">b</code> </td>
<td style="text-align: left"> device a blocchi </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">p</code> </td>
<td style="text-align: left"> pipe con nome </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">s</code> </td>
<td style="text-align: left"> socket </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Per cambiare il proprietario di un file da un account root si usa
<code class="literal">chown</code>(1). Per cambiare il gruppo di un file dall'account
del proprietario o da quello di root si usa <code class="literal">chgrp</code>(1). Per
cambiare i permessi di accesso di file o directory dall'account del
proprietario o da quello di root si usa <code class="literal">chmod</code>(1). La
sintassi di base per manipolare un file <code class="literal">pippo</code> è la
seguente.</p>
<pre class="screen"># chown <span class="emphasis"><em>newowner</em></span> foo
# chgrp <span class="emphasis"><em>newgroup</em></span> foo
# chmod [ugoa][+-=][rwxXst][,...] foo</pre>
<p>Per esempio si può fare in modo che l'utente <code class="literal">pippo</code> sia il
proprietario di un albero di directory condivisa dal gruppo
<code class="literal">pluto</code> con i seguenti comandi.</p>
<pre class="screen"># cd <span class="emphasis"><em>/some/location/</em></span>
# chown -R foo:bar .
# chmod -R ug+rwX,o=rX .</pre>
<p>Ci sono altri tre bit speciali di permessi.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Il bit <span class="strong"><strong>set user ID</strong></span> (<span class="strong"><strong>s</strong></span> o <span class="strong"><strong>S</strong></span> al posto
del permesso <span class="strong"><strong>x</strong></span> dell'utente). </p>
</li>
<li class="listitem">
<p> Il bit <span class="strong"><strong>set group ID</strong></span> (<span class="strong"><strong>s</strong></span> o <span class="strong"><strong>S</strong></span> al posto
del permesso <span class="strong"><strong>x</strong></span> del gruppo). </p>
</li>
<li class="listitem">
<p> Il bit <span class="strong"><strong>sticky</strong></span> (<span class="strong"><strong>t</strong></span> o <span class="strong"><strong>T</strong></span> al posto
del permesso <span class="strong"><strong>x</strong></span> degli altri). </p>
</li>
</ul>
</div>
<p>Nell'output di "<code class="literal">ls -l</code>" il valore di questi bit è
<span class="strong"><strong>maiuscolo</strong></span> se il bit di permesso di
esecuzione nascosto da essi è <span class="strong"><strong> non
impostato</strong></span>.</p>
<p>L'impostazione del bit <span class="strong"><strong>set user ID</strong></span> per un
file eseguibile permette ad un utente di eseguire quel file con l'ID del
proprietario del file (per esempio <span class="strong"><strong>root</strong></span>). In modo simile, l'impostazione del bit
<span class="strong"><strong>set group ID</strong></span> per un file eseguibile
permette ad un utente di eseguire il file con l'ID del gruppo a cui
appartiene il file (per esempio <span class="strong"><strong>root</strong></span>). Poiché l'impostazione di questi bit può
causare rischi in termini di sicurezza, il loro uso richiede una particolare
cautela.</p>
<p>L'impostazione del bit <span class="strong"><strong>set group ID</strong></span> per
una directory abilita lo schema di creazione di file in <a class="ulink" href="https://it.wikipedia.org/wiki/Berkeley_Software_Distribution">stile BSD</a>, in cui tutti i file creati nella
directory appartengono al <span class="strong"><strong>gruppo</strong></span> della
directory.</p>
<p>L'impostazione dello <span class="strong"><strong>sticky bit</strong></span> per una
directory impedisce la rimozione di un file nella directory da parte
dell'utente che non ne è il proprietario. Per preservare i contenuti di un
file in directory con permessi di scrittura per tutti, come
"<code class="literal">/tmp</code>" o in directory con permessi di scrittura per un
gruppo, non solo si deve impostare il permesso di <span class="strong"><strong>scrittura</strong></span> per il file, ma anche impostare lo
<span class="strong"><strong>sticky bit</strong></span> per la directory. In caso
contrario, qualunque utente con i permessi di scrittura per la directory può
rimuovere il file e crearne uno nuovo con lo stesso nome.</p>
<p>Ecco alcuni interessanti esempi di permessi dei file.</p>
<pre class="screen">$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
crw------T 1 root root 108, 0 Oct 16 20:57 /dev/ppp
-rw-r--r-- 1 root root 2761 Aug 30 10:38 /etc/passwd
-rw-r----- 1 root shadow 1695 Aug 30 10:38 /etc/shadow
-rwsr-xr-x 1 root root 973824 Sep 23 20:04 /usr/sbin/exim4
$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
drwxrwxrwt 14 root root 20480 Oct 16 21:25 /tmp
drwxrwsr-x 10 root staff 4096 Sep 29 22:50 /usr/local
drwxr-xr-x 10 root root 4096 Oct 11 00:28 /usr/src
drwxrwsr-x 2 root mail 4096 Oct 15 21:40 /var/mail
drwxrwxrwt 3 root root 4096 Oct 16 21:20 /var/tmp</pre>
<p>Esiste un metodo numerico alternativo per descrivere i permessi dei file con
<code class="literal">chmod</code>(1); tale metodo numerico usa numeri ottali (base=8)
di 3 o 4 cifre.</p>
<div class="table">
<a id="thenumericmodefoinchmodbcommands"/>
<p class="title">
<strong>Tabella 1.5. Permessi in notazione numerica per i comandi <code class="literal">chmod</code>(1)</strong>
</p>
<div class="table-contents">
<table class="table" summary="Permessi in notazione numerica per i comandi chmod(1)" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> cifra </th>
<th style="text-align: left"> significato </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> 1ª cifra opzionale </td>
<td style="text-align: left"> somma di <span class="strong"><strong>set user ID</strong></span> (=4), <span class="strong"><strong>set group ID</strong></span> (=2) e <span class="strong"><strong>sticky
bit</strong></span> (=1) </td>
</tr>
<tr>
<td style="text-align: left"> 2ª cifra </td>
<td style="text-align: left"> somma dei permessi di <span class="strong"><strong>lettura</strong></span> (=4),
<span class="strong"><strong>scrittura</strong></span> (=2) e <span class="strong"><strong>esecuzione</strong></span> (=1) per l'<span class="strong"><strong>utente</strong></span> </td>
</tr>
<tr>
<td style="text-align: left"> 3ª cifra </td>
<td style="text-align: left"> come sopra, ma per il<span class="strong"><strong>gruppo</strong></span> </td>
</tr>
<tr>
<td style="text-align: left"> 4ª cifra </td>
<td style="text-align: left"> come sopra, ma per gli <span class="strong"><strong>altri</strong></span> </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Sembra complicato, ma è in realtà piuttosto semplice. Se si guardano le
prime colonne (2-10) nell'output del comando "<code class="literal">ls -l</code>" e le
si leggono come una rappresentazione binaria (base=2) dei permessi sui file
(dove "-" equivale a "0" e "rwx" equivalgono a "1"), le ultime 3 cifre del
valore numerico dei permessi dovrebbero apparire come la corretta
rappresentazione dei permessi sui file in numerazione ottale (base=8).</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ touch foo bar
$ chmod u=rw,go=r foo
$ chmod 644 bar
$ ls -l foo bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
-rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo</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>Se si deve aver accesso alle informazioni visualizzate da "<code class="literal">ls
-l</code>" in script di shell, si dovrebbero usare i comandi pertinenti,
come <code class="literal">test</code>(1), <code class="literal">stat</code>(1) e
<code class="literal">readlink</code>(1). Si possono usare anche i comandi interni
della shell come "<code class="literal">[</code>" o "<code class="literal">test</code>".</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_control_of_permissions_for_newly_created_files_umask"/>1.2.4. Controllo dei permessi per i file appena creati: umask</h3>
</div>
</div>
</div>
<p>I permessi che vengono applicati ad un file o una directory appena creati
sono limitati dal comando interno della shell
<code class="literal">umask</code>. Vedere <code class="literal">dash</code>(1),
<code class="literal">bash</code>(1) e <code class="literal">builtins</code>(7).</p>
<pre class="screen"> (file permissions) = (requested file permissions) & ~(umask value)</pre>
<div class="table">
<a id="theumaskvalueexamples"/>
<p class="title">
<strong>Tabella 1.6. Esempi di valori di <span class="strong">umask</span></strong>
</p>
<div class="table-contents">
<table class="table" summary="Esempi di valori di umask" 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"> umask </th>
<th style="text-align: left"> permessi dei file creati </th>
<th style="text-align: left"> permessi delle directory create </th>
<th style="text-align: left"> uso </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">0022</code> </td>
<td style="text-align: left"> <code class="literal">-rw-r--r--</code> </td>
<td style="text-align: left"> <code class="literal">-rwxr-xr-x</code> </td>
<td style="text-align: left"> scrivibile solo dall'utente </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">0002</code> </td>
<td style="text-align: left"> <code class="literal">-rw-rw-r--</code> </td>
<td style="text-align: left"> <code class="literal">-rwxrwxr-x</code> </td>
<td style="text-align: left"> scrivibile solo dal gruppo </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Il sistema Debian usa, in modo predefinito, uno schema UPG (User Private
Group, gruppo privato dell'utente). Ogni volta che viene aggiunto un nuovo
utente al sistema, viene creato un UPG; questo ha lo stesso nome dell'utente
per il quale è stato creato e quell'utente è l'unico membro dell'UPG. Lo
schema UPG rende sicura l'impostazione della umask a <code class="literal">0002</code>
dato che ogni utente ha il proprio gruppo privato. (In alcune varianti di
Unix è abbastanza comune impostare tutti gli utenti normali come
appartenenti ad un unico gruppo <span class="strong"><strong>users<code class="literal"> ed è
in quel caso una buona idea impostare umask a </code>0022</strong></span> per
ragioni di sicurezza.)</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>Abilitare UPG inserendo "<code class="literal">umask 002</code>" nel file
<code class="literal">~/.bashrc</code>.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_permissions_for_groups_of_users_group"/>1.2.5. Permessi per gruppi di utenti (gruppi)</h3>
</div>
</div>
</div>
<p>Per far sì che i permessi di un gruppo vengano applicati ad un particolare
utente, tale utente deve essere inserito come membro del gruppo usando
"<code class="literal">sudo vigr</code>" per <code class="literal">/etc/group</code> e
"<code class="literal">sudo vigr -s</code>" per <code class="literal">/etc/gshadow</code>. Per
abilitare la nuova configurazione dei gruppi è necessario fare il log out e
quindi di nuovo il login (oppure eseguire "<code class="literal">exec newgrp</code>").</p>
<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>In alternativa, si possono aggiungere dinamicamente gli utenti ai gruppi
durante il processo di autenticazione aggiungendo la riga "<code class="literal">auth
optional pam_group.so</code>" al file
"<code class="literal">/etc/pam.d/common-auth</code>" e configurando
"<code class="literal">/etc/security/group.conf</code>". (Vedere <a class="xref" href="ch04.it.html" title="Capitolo 4. Autenticazione e controllo degli accessi">Capitolo 4, <em>Autenticazione e controllo degli accessi</em></a>.)</p>
</td>
</tr>
</table>
</div>
<p>I dispositivi hardware sono, in un sistema Debian, semplicemente un altro
tipo di file. Se si hanno problemi ad accedere a dispositivi quali CD-ROM e
chiavette USB da un account utente, si dovrebbe inserire quell'utente nel
gruppo appropriato.</p>
<p>Alcuni importanti gruppi pre-impostati dal sistema permettono ai loro membri
l'accesso a file e device particolari senza i privilegi di
<code class="literal">root</code>.</p>
<div class="table">
<a id="listofnotablesysupsforfileaccess"/>
<p class="title">
<strong>Tabella 1.7. Elenco dei principali gruppi forniti dal sistema per accesso ai file</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco dei principali gruppi forniti dal sistema per accesso ai file" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> gruppo </th>
<th style="text-align: left"> descrizione dei file e device accessibili </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">dialout</code> </td>
<td style="text-align: left"> accesso diretto e completo alle porte seriali
("<code class="literal">/dev/ttyS[0-3]</code>") </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">dip</code> </td>
<td style="text-align: left"> accesso limitato alle porte seriali per connessione <span class="strong"><strong>IP dialup</strong></span> a peer fidati </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cdrom</code> </td>
<td style="text-align: left"> unità CD-ROM, DVD+/-RW </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">audio</code> </td>
<td style="text-align: left"> device audio </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">video</code> </td>
<td style="text-align: left"> device video </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">scanner</code> </td>
<td style="text-align: left"> scanner </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">adm</code> </td>
<td style="text-align: left"> registri di monitoraggio del sistema </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">staff</code> </td>
<td style="text-align: left"> alcune directory per compiti minori di amministrazione:
""<code class="literal">/usr/local</code>", "<code class="literal">/home</code>" </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>È necessario far parte del gruppo <code class="literal">dialout</code> per
riconfigurare il modem, comporre numeri, ecc. Se però
<code class="literal">root</code> crea file di configurazione predefiniti per i peer
fidati in "<code class="literal">/etc/ppp/peers/</code>", è necessario solamente far
parte del grupo <code class="literal">dip</code> per creare una connessione <span class="strong"><strong>IP dialup</strong></span> a tali peer fidati usando i comandi
<code class="literal">pppd</code>(8), <code class="literal">pon</code>(1) e
<code class="literal">poff</code>(1).</p>
</td>
</tr>
</table>
</div>
<p>Alcuni importanti gruppi pre-impostati dal sistema permettono ai loro membri
di eseguire particolari comandi senza i privilegi di
<code class="literal">root</code>.</p>
<div class="table">
<a id="listofnotablesysommandexecutions"/>
<p class="title">
<strong>Tabella 1.8. Elenco dei principali gruppi forniti dal sistema per l'esecuzione di
particolari comandi</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco dei principali gruppi forniti dal sistema per l'esecuzione di particolari comandi" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> gruppo </th>
<th style="text-align: left"> comandi accessibili </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">sudo</code> </td>
<td style="text-align: left"> eseguire <code class="literal">sudo</code> senza password </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">lpadmin</code> </td>
<td style="text-align: left"> eseguire comandi per aggiungere, modificare e rimuovere stampanti dal
database delle stampanti </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Per l'elenco completo degli utenti e gruppi forniti dal sistema, vedere la
recente versione del documento "Utenti e gruppi" in
"<code class="literal">/usr/share/doc/base-passwd/users-and-groups.html</code>"
fornito dal pacchetto <code class="literal">base-passwd</code>.</p>
<p>Vedere <code class="literal">passwd</code>(5), <code class="literal">group</code>(5),
<code class="literal">shadow</code>(5), <code class="literal">newgrp</code>(1),
<code class="literal">vipw</code>(8), <code class="literal">vigr</code>(8) e
<code class="literal">pam_group</code>(8) per informazioni sui comandi di gestione di
utenti e gruppi sul sistema.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_timestamps"/>1.2.6. Orari</h3>
</div>
</div>
</div>
<p>Ci sono tre tipi di orari per un file GNU/Linux.</p>
<div class="table">
<a id="listoftypesoftimestamps"/>
<p class="title">
<strong>Tabella 1.9. Elenco dei tipi di data</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco dei tipi di data" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> tipo </th>
<th style="text-align: left"> significato (definizione storica Unix) </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <span class="strong"><strong>mtime</strong></span> </td>
<td style="text-align: left"> orario di modifica del file (<code class="literal">ls -l</code>) </td>
</tr>
<tr>
<td style="text-align: left"> <span class="strong"><strong>ctime</strong></span> </td>
<td style="text-align: left"> orario di cambiamento di stato del file (<code class="literal">ls -lc</code>) </td>
</tr>
<tr>
<td style="text-align: left"> <span class="strong"><strong>atime</strong></span> </td>
<td style="text-align: left"> orario dell'ultimo accesso al file (<code class="literal">ls -lu</code>) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<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><span class="strong"><strong>ctime</strong></span> non è l'orario di creazione del
file.</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>L'attuale significato di <span class="strong"><strong>atime</strong></span> sui
sistemi GNU/Linux potrebbe essere diverso dalla sua definizione storica in
Unix.</p>
</td>
</tr>
</table>
</div>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> La sovrascrittura di un file cambia tutti gli attributi <span class="strong"><strong>mtime</strong></span>, <span class="strong"><strong>ctime</strong></span> e
<span class="strong"><strong>atime</strong></span> del file. </p>
</li>
<li class="listitem">
<p> Il cambiamento del proprietario o dei permessi di un file cambia gli
attributi <span class="strong"><strong>ctime</strong></span> e <span class="strong"><strong>atime</strong></span> del file. </p>
</li>
<li class="listitem">
<p> La lettura di un file cambia l'attributo <span class="strong"><strong>atime</strong></span> di un file nei sistemi Unix storici. </p>
</li>
<li class="listitem">
<p> La lettura di un file cambia l'attributo <span class="strong"><strong>atime</strong></span> di un file in un sistema GNU/Linux se il file
system è montato con "<code class="literal">strictatime</code>". </p>
</li>
<li class="listitem">
<p> Leggere un file per la prima volta o dopo un giorno modifica l'attributo
<span class="strong"><strong>atime</strong></span> del file stesso su sistemi
GNU/Linux, se il filesystem è stato montato con
"<code class="literal">relatime</code>". (comportamento di default da Linux 2.6.30) </p>
</li>
<li class="listitem">
<p> Leggere un file non modifica l'attributo <span class="strong"><strong>atime</strong></span> del file stesso su sistemi GNU/Linux se il
filesystem è stato montato con "<code class="literal">noatime</code>". </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>Le opzioni di mount "<code class="literal">noatime</code>" e
"<code class="literal">relatime</code>" sono introdotte per migliorare le prestazioni
in lettura del file system nei normali casi d'uso. Semplici operazioni di
lettura dei file con l'opzione "<code class="literal">strictatime</code>" comportano
lunghe operazioni di scrittura per aggiornare l'attributo <span class="strong"><strong>atime</strong></span>. L'attributo <span class="strong"><strong>atime</strong></span> però è raramente utilizzato, a parte per il
file <code class="literal">mbox</code>(5). Vedere <code class="literal">mount</code>(8).</p>
</td>
</tr>
</table>
</div>
<p>Usare il comando <code class="literal">touch</code>(1) per cambiare l'orario di file
esistenti.</p>
<p>Per gli orari, il comando <code class="literal">ls</code> produce in output stringhe
localizzate con la localizzazione non inglese
("<code class="literal">it_IT.UTF-8</code>").</p>
<pre class="screen">$ LANG=C ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
$ LANG=en_US.UTF-8 ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
$ LANG=fr_FR.UTF-8 ls -l foo
-rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo</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>Vedere <a class="xref" href="ch09.it.html#_customized_display_of_time_and_date" title="9.3.4. Visualizzazione personalizzata di date e orari">Sezione 9.3.4, «Visualizzazione personalizzata di date e orari»</a> per
personalizzare l'output di "<code class="literal">ls -l</code>".</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_links"/>1.2.7. Collegamenti</h3>
</div>
</div>
</div>
<p>Ci sono due metodi per associale un file "<code class="literal">pippo</code>" ad un
diverso nome file "<code class="literal">pluto</code>".</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> <a class="ulink" href="https://it.wikipedia.org/wiki/Collegamento_fisico">Collegamento fisico</a> </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Nome duplicato per un file esistente </p>
</li>
<li class="listitem">
<p> "<code class="literal">ln pippo pluto</code>" </p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p> <a class="ulink" href="https://it.wikipedia.org/wiki/Collegamento_simbolico">Collegamento simbolico o
symlink</a> </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> File speciale che punta ad un altro file in base al nome </p>
</li>
<li class="listitem">
<p> "<code class="literal">ln -s pippo pluto</code>" </p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>Vedere l'esempio seguente per notare i cambiamenti nel conteggio dei
collegamenti e le sottili differenze tra i risultati del comando
<code class="literal">rm</code>.</p>
<pre class="screen">$ umask 002
$ echo "Original Content" > foo
$ ls -li foo
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
$ ln foo bar # hard link
$ ln -s foo baz # symlink
$ ls -li foo bar baz
1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> foo
1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
$ rm foo
$ echo "New Content" > foo
$ ls -li foo bar baz
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> foo
1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
$ cat bar
Original Content
$ cat baz
New Content</pre>
<p>Il collegamento fisico può essere creato all'interno dello stesso file
system e condivide lo stesso numero di inode, come rivela l'opzione
"<code class="literal">-i</code>" di <code class="literal">ls</code>(1).</p>
<p>Il collegamento simbolico ha sempre permessi di accesso nominali
"<code class="literal">rwxrwxrwx</code>, come mostrato nell'esempio precedente, ma con
gli effettivi permessi di accesso stabiliti dai permessi del file a cui
punta.</p>
<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>In generale è una buona idea non creare collegamenti simbolici complicati o
non creare collegamenti fisici per nulla, a meno di non avere una ragione
molto buona per farlo. Possono diventare degli incubi quando la combinazione
logica dei collegamenti simbolici crea cicli ricorsivi nel file system.</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>È in generale preferibile usare collegamenti simbolici piuttosto che fisici,
a meno che non sia abbia una buona ragione per usare un collegamento fisico.</p>
</td>
</tr>
</table>
</div>
<p>La directory "<code class="literal">.</code>" punta alla directory in cui appare,
perciò il conteggio dei collegamenti per ogni nuova directory inizia da
2. La directory "<code class="literal">..</code>" punta alla directory genitore,
perciò il conteggio dei collegamenti di una directory aumenta con l'aggiunta
di nuove sottodirectory.</p>
<p>Se si è appena passati da Windows a Linux, appare presto chiaro come sia ben
progettato il collegamento dei nomi di file in Unix se paragonato con i
collegamenti in ambiente Windows che sono l'equivalente più prossimo in quel
sistema. Dato che sono implementati nel file system, le applicazioni non
possono vedere alcuna differenza tra un file collegamento ed un
originale. Nel caso di collegamenti fisici, non c'è realmente nessuna
differenza.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_named_pipes_fifos"/>1.2.8. Pipe con nome (FIFO)</h3>
</div>
</div>
</div>
<p>Una <a class="ulink" href="https://it.wikipedia.org/wiki/Pipe#FIFO_o_named_pipe">pipe con nome</a> è un file che si comporta
da pipe. Si mette qualcosa dentro il file e questa cosa esce dall'altra
parte. Questa è chiamata una FIFO (First-In-First_Out, primo ad
entrare-primo ad uscire): la prima cosa che viene immessa nella pipe è la
prima ad uscire dall'altra estremità.</p>
<p>Se si scrive su una pipe con nome, il processo che sta eseguendo la
scrittura nella pipe non termina fino a che l'informazione scritta nella
pipe non viene letta. Se si legge da una pipe con nome, il processo di
lettura attende che non ci sia più nulla da leggere prima di terminare. La
dimensione della pipe è sempre zero: non archivia dati, ma semplicemente
collega due processi come fa la funzionalità fornita dalla sintassi per pipe
"<code class="literal">|</code>" della shell. Tuttavia, dato che questa pipe ha un
nome, i due processi non devono essere nella stessa riga di comando e
nemmeno essere eseguiti dallo stesso utente. Le pipe sono un'innovazione di
Unix di grandissimo impatto.</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ cd; mkfifo mypipe
$ echo "hello" >mypipe & # put into background
[1] 8022
$ ls -l mypipe
prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
$ cat mypipe
hello
[1]+ Done echo "hello" >mypipe
$ ls mypipe
mypipe
$ rm mypipe</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_sockets"/>1.2.9. Socket</h3>
</div>
</div>
</div>
<p>I socket sono usati moltissimo da tutte le comunicazioni Internet, da
database e dal sistema operativo stesso. Sono simili alle pipe con nome
(FIFO) e permettono ai processi di scambiare informazioni anche tra computer
diversi. Per un socket, non è necessario che questi processi siano in
esecuzione contemporaneamente, né di essere eseguiti come processi figli di
uno stesso processo antenato. Questo è il punto culminante della <a class="ulink" href="https://it.wikipedia.org/wiki/Comunicazione_tra_processi">comunicazione tra processi
(IPC)</a>. Lo scambio di informazioni può avvenire sulla rete tra host
diversi. I due più comuni sono il <a class="ulink" href="https://en.wikipedia.org/wiki/Internet_socket">socket
Internet</a> e gli <a class="ulink" href="https://en.wikipedia.org/wiki/Unix_domain_socket">Unix domain
socket</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>"<code class="literal">netstat -an</code>" fornisce una vista d'insieme molto utile
dei socket aperti su un dato sistema.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_device_files"/>1.2.10. File di device</h3>
</div>
</div>
</div>
<p>I <a class="ulink" href="https://en.wikipedia.org/wiki/Device_file">file di device</a> fanno riferimento a
dispositivi fisici o virtuali sul sistema, come i dischi fissi, la scheda
video, lo schermo o la tastiera. Un esempio di dispositivo virtuale è la
console, rappresentata da "<code class="literal">/dev/console</code>".</p>
<p>Ci sono 2 tipi di file di device.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> <span class="strong"><strong>Device a caratteri</strong></span> </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Vi si accede un carattere alla volta. </p>
</li>
<li class="listitem">
<p> 1 carattere = 1 byte </p>
</li>
<li class="listitem">
<p> Es., device della tastiera, porta seriale, ... </p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p> <span class="strong"><strong>Device a blocchi</strong></span> </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Vi si accede in base a unità più grandi chiamate blocchi. </p>
</li>
<li class="listitem">
<p> 1 blocco > 1 byte </p>
</li>
<li class="listitem">
<p> Es., dischi fissi, ... </p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>I file di device possono essere letti e scritti, anche se è probabile che i
file contengano dati binari che appaiono come farfuglii incomprensibili per
le persone. La scrittura diretta di dati in questi file è utile a volte per
trovare la soluzione a problemi con le connessioni hardware. Si può, per
esempio, fare il dump di un file di testo in un device di stampa
"<code class="literal">/dev/lp0</code>" o inviare comandi del modem alla porta seriale
appropriata "<code class="literal">/dev/ttyS0</code>". Ma, a meno che ciò non venga
fatto con cautela, può causare grandissimi disastri. Perciò, essere
prudenti.</p>
<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 il normale accesso ad una stampante, usare <code class="literal">lp</code>(1).</p>
</td>
</tr>
</table>
</div>
<p>I numeri di nodo dei device sono visualizzati se si esegue
<code class="literal">ls</code>(1) come nell'esempio seguente.</p>
<pre class="screen">$ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
brw-rw---T 1 root disk 8, 0 Oct 16 20:57 /dev/sda
brw-rw---T+ 1 root cdrom 11, 0 Oct 16 21:53 /dev/sr0
crw-rw---T 1 root dialout 4, 64 Oct 16 20:57 /dev/ttyS0
crw-rw-rw- 1 root root 1, 5 Oct 16 20:57 /dev/zero</pre>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> "<code class="literal">/dev/sda</code>" ha major number del device 8 e minor number
del device 0. È accessibile in lettura e scrittura dagli utenti che
appartengono al gruppo <code class="literal">disk</code>. </p>
</li>
<li class="listitem">
<p> "<code class="literal">/dev/sr0</code>" ha major number del device 11 e minor number
del device 0. È accessibile in lettura e scrittura dagli utenti che
appartengono al gruppo <code class="literal">cdrom</code>. </p>
</li>
<li class="listitem">
<p> "<code class="literal">/dev/ttyS0</code>" ha major number del device 4 e minor number
del device 64. È accessibile in lettura e scrittura dagli utenti che
appartengono al gruppo <code class="literal">dialout</code>. </p>
</li>
<li class="listitem">
<p> "<code class="literal">/dev/zero</code>" ha major number del device 1 e minor number
del device 5. È accessibile in lettura e scrittura da chiunque. </p>
</li>
</ul>
</div>
<p>Nei sistemi Linux moderni il file system sotto "<code class="literal">/dev</code>"
viene popolato automaticamente dal meccanismo <code class="literal">udev</code>(7).</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_special_device_files"/>1.2.11. File di device speciali</h3>
</div>
</div>
</div>
<p>Ci sono alcuni file di device speciali.</p>
<div class="table">
<a id="listofspecialdevicefiles"/>
<p class="title">
<strong>Tabella 1.10. Elenco di file dei device speciali</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di file dei device speciali" 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"> file di device </th>
<th style="text-align: left"> azione </th>
<th style="text-align: left"> descrizione della risposta </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">/dev/null</code> </td>
<td style="text-align: left"> lettura </td>
<td style="text-align: left"> restituisce il "carattere EOF (End of File, fine del file)" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/dev/null</code> </td>
<td style="text-align: left"> scrittura </td>
<td style="text-align: left"> non ritorna nulla (un pozzo senza fondo in cui buttare via dati) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/dev/zero</code> </td>
<td style="text-align: left"> lettura </td>
<td style="text-align: left"> ritorna il "carattere <code class="literal">\0</code> (NUL)", diverso dal numero zero
in ASCII </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/dev/random</code> </td>
<td style="text-align: left"> lettura </td>
<td style="text-align: left"> ritorna caratteri a caso da un vero generatore di numeri casuali che dà
reale entropia (lento) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/dev/urandom</code> </td>
<td style="text-align: left"> lettura </td>
<td style="text-align: left"> ritorna caratteri casuali da un generatore di numeri pseudocasuali
crittograficamente sicuro </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/dev/full</code> </td>
<td style="text-align: left"> scrittura </td>
<td style="text-align: left"> ritorna l'errore di disco pieno (ENOSPC) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Sono spesso usati insieme alla redirezione di shell (vedere <a class="xref" href="ch01.it.html#_typical_command_sequences_and_shell_redirection" title="1.5.8. Sequenze tipiche di comandi e ridirezione della shell">Sezione 1.5.8, «Sequenze tipiche di comandi e ridirezione della shell»</a>).</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_procfs_and_sysfs"/>1.2.12. procfs e sysfs</h3>
</div>
</div>
</div>
<p><a class="ulink" href="https://it.wikipedia.org/wiki/Procfs">procfs</a> e <a class="ulink" href="https://en.wikipedia.org/wiki/Sysfs">sysfs</a>,
montati in "<code class="literal">/proc</code>" e "<code class="literal">/sys</code>" sono
pseudo-file system ed espongono strutture interne di dati del kernel nello
spazio utente. In altre parole, queste voci sono virtuali, funzionano cioè
come una comoda finestra sul funzionamento del sistema operativo.</p>
<p>La directory "<code class="literal">/proc</code>" contiene (tra le altre cose) una
sottodirectory per ciascun processo in esecuzione sul sistema che prende
nome dall'ID del processo (PID). Le utilità di sistema, come
<code class="literal">ps</code>(1), che accedono alle informazioni sui processi,
ottengono le loro informazioni da questa struttura di directory.</p>
<p>Le directory in "<code class="literal">/proc/sys/</code>" contengono interfacce per
cambiare certi parametri del kernel durante l'esecuzione. (Si può fare la
stessa cosa tramite comandi <code class="literal">sysctl</code>(8) specifici o tramite
il suo file di precaricamento/configurazione
"<code class="literal">/etc/sysctl.conf</code>".)</p>
<p>Le persone spesso vanno in panico quando si accorgono di un file in
particolare, "<code class="literal">/proc/kcore</code>" che è particolarmente
enorme. È (più o meno) una copia del contenuto della memoria del computer ed
è usato per fare il debug del kernel. È un file virtuale che punta alla
memoria del computer perciò non ci si preoccupi della sua dimensione.</p>
<p>La directory "<code class="literal">/sys</code>" contiene strutture dati del kernel
esportate, i loro attributi e i collegamenti tra di esse. Contiene anche
interfacce per cambiare alcuni parametri del kernel durante l'esecuzione.</p>
<p>Vedere <code class="literal">proc.txt(.gz)</code>",
"<code class="literal">sysfs.txt(.gz)</code>" e altri documenti correlati nella
documentazione del kernel Linux
("<code class="literal">/usr/share/doc/linux-doc-*/Documentation/filesystems/*</code>")
fornita dai pacchetti <code class="literal">linux-doc-*</code>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_tmpfs"/>1.2.13. tmpfs</h3>
</div>
</div>
</div>
<p><a class="ulink" href="https://en.wikipedia.org/wiki/Tmpfs#Linux">tmpfs</a> è un file system temporaneo che contiene
tutti i file nella <a class="ulink" href="https://it.wikipedia.org/wiki/Memoria_virtuale">memoria virtuale</a>. I
dati del tmpfs nella <a class="ulink" href="https://en.wikipedia.org/wiki/Page_cache">page cache</a> in memoria
possono essere spostati nello <a class="ulink" href="https://it.wikipedia.org/wiki/Paging">spazio di
swap</a> su disco quando necessario.</p>
<p>La directory "<code class="literal">/run</code>" viene montata come il tmpfs nelle
prime fasi del processo di avvio. Ciò vi permette la scrittura anche quando
la directory "<code class="literal">/</code>" è montata in sola lettura. Questa è la
nuova posizione per la memorizzazione dei file transitori e sostituisce
diverse posizioni descritte nella versione 2.3 del <a class="ulink" href="https://it.wikipedia.org/wiki/Filesystem_Hierarchy_Standard">Filesystem Hierarchy
Standard</a>(Standard per la gerarchia del file system):</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> "<code class="literal">/var/run</code>" → "<code class="literal">/run</code>" </p>
</li>
<li class="listitem">
<p> "<code class="literal">/var/lock</code>" → "<code class="literal">/run/lock</code>" </p>
</li>
<li class="listitem">
<p> "<code class="literal">/dev/shm</code>" → "<code class="literal">/run/shm</code>" </p>
</li>
</ul>
</div>
<p>Vedere "<code class="literal">tmpfs.txt(.gz)</code>" nella documentazione del kernel
Linux
("<code class="literal">/usr/share/doc/linux-doc-*/Documentation/filesystems/*</code>")
fornita dai pacchetti <code class="literal">linux-doc-*</code>.</p>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="_midnight_commander_mc"/>1.3. Midnight Commander (MC)</h2>
</div>
</div>
</div>
<p><a class="ulink" href="https://it.wikipedia.org/wiki/Midnight_Commander">Midnight Commander (MC)</a> è un
"coltellino svizzero" GNU per la console Linux ed altri ambienti in
terminale. Dà ai principianti la possibilità di usare una console comandata
da menu che è molto più facile da imparare dei comandi Unix standard.</p>
<p>Potrebbe essere necessario installare il pacchetto di Midnight Commander che
si chiama "<code class="literal">mc</code>" con il seguente comando.</p>
<pre class="screen">$ sudo apt-get install mc</pre>
<p>Usare il comando <code class="literal">mc</code>(1) per esplorare il sistema Debian. È
il modo migliore di imparare. Esplorare qualche posizione interessante
usando semplicemente i tasti freccia e il tasto Invio.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> "<code class="literal">/etc</code>" e le sue sottodirectory </p>
</li>
<li class="listitem">
<p> "<code class="literal">/var/log</code>" e le sue sottodirectory </p>
</li>
<li class="listitem">
<p> "<code class="literal">/usr/share/doc</code>" e le sue sottodirectory </p>
</li>
<li class="listitem">
<p> "<code class="literal">/sbin</code>" e "<code class="literal">/bin</code>" </p>
</li>
</ul>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_customization_of_mc"/>1.3.1. Personalizzazione di MC</h3>
</div>
</div>
</div>
<p>Per far sì che MC cambi la directory di lavoro in uscita e si sposti con
<code class="literal">cd</code> nella directory, suggerisco di modificare
"<code class="literal">~/.bashrc</code>" per includere uno scipt fornito nel pacchetto
<code class="literal">mc</code>.</p>
<pre class="screen">. /usr/lib/mc/mc.sh</pre>
<p>Vedere <code class="literal">mc</code>(1) (sotto l'opzione "<code class="literal">-P</code>")
per capirne la ragione. (Se non è chiaro esattamento quello di cui sto
parlando, si può tornare a questo più tardi.)</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_starting_mc"/>1.3.2. Avvio di MC</h3>
</div>
</div>
</div>
<p>MC può essere avviato nel modo seguente.</p>
<pre class="screen">$ mc</pre>
<p>MC si prende cura di tutte le operazioni sui file attraverso i suoi menu,
richiedendo perciò solo un minimo sforzo da parte dell'utente. Premere
semplicemente F1 per ottenere la schermata di aiuto. Si può giocherellare
con MC premendo semplicemente i tasti freccia e i tasti funzione.</p>
<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>In alcune console, come <code class="literal">gnome-terminal</code>(1), le pressioni
dei tasti funzione potrebbero essere rubate dal programma di console. Si
possono disabilitare queste funzionalità per
<code class="literal">gnome-terminal</code> nei menu "Preferenze" → "Generale" e
"Scorciatoie".</p>
</td>
</tr>
</table>
</div>
<p>Se si incontrano problemi di codifica dei caratteri con visualizzazione di
caratteri spazzatura, l'aggiunta dell'opzione "<code class="literal">-a</code>" alla
riga di comando di MC può aiutare a prevenirli.</p>
<p>Se ciò non risolve i problemi di visualizzazione in MC, vedere <a class="xref" href="ch09.it.html#_the_terminal_configuration" title="9.5.6. Configurazione del terminale">Sezione 9.5.6, «Configurazione del terminale»</a>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_file_manager_in_mc"/>1.3.3. Gestore dei file in MC</h3>
</div>
</div>
</div>
<p>L'impostazione predefinita è con due pannelli di directory contenenti gli
elenchi dei file. Un'altra utile modalità è l'impostazione della finestra
destra per contenere le "informazioni" per vedere informazioni sui privilegi
di accesso dei file, ecc. Di seguito sono elencati alcuni tasti
essenziali. Con il demone <code class="literal">gpm</code>(8) in esecuzione, si può
anche usare il mouse in una console a caratteri Linux. (Assicurarsi di
premeri il tasto Maiusc per ottenere il comportamento normale di taglia e
incolla in MC.)</p>
<div class="table">
<a id="thekeybindingsofmc"/>
<p class="title">
<strong>Tabella 1.11. Le associazioni dei tasti di MC</strong>
</p>
<div class="table-contents">
<table class="table" summary="Le associazioni dei tasti di MC" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> tasto </th>
<th style="text-align: left"> azione associata </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">F1</code> </td>
<td style="text-align: left"> menu di aiuto </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">F3</code> </td>
<td style="text-align: left"> visualizzatore interno di file </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">F4</code> </td>
<td style="text-align: left"> editor interno </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">F9</code> </td>
<td style="text-align: left"> attiva il menu a tendina </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">F10</code> </td>
<td style="text-align: left"> esce da Midnight Commander </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Tab</code> </td>
<td style="text-align: left"> sposta tra le due finestre </td>
</tr>
<tr>
<td style="text-align: left"><code class="literal">Insert</code> o <code class="literal">Ctrl-T</code> </td>
<td style="text-align: left"> segna il file per una operazione su più file, come la copia </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Del</code> </td>
<td style="text-align: left"> cancella il file (essere prudenti: impostare MC per la modalità di
cancellazione sicura) </td>
</tr>
<tr>
<td style="text-align: left"> tasti freccia </td>
<td style="text-align: left"> intuitivi </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_command_line_tricks_in_mc"/>1.3.4. Trucchetti per la riga di comando di MC</h3>
</div>
</div>
</div>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>Il comando <code class="literal">cd</code> cambia la directory mostrata nel pannello
selezionato. </p>
</li>
<li class="listitem">
<p><code class="literal">Ctrl-Invio</code> o <code class="literal">Alt-Invio</code> copia un nome
di file nella riga di comando. Usarlo con i comandi <code class="literal">cp</code>(1)
e <code class="literal">mv</code>(1) assieme alla modifica della riga di comando. </p>
</li>
<li class="listitem">
<p><code class="literal">Alt-Tab</code> mostra le scelte date dall'espansione di shell
dei nomi di file. </p>
</li>
<li class="listitem">
<p> Si possono specificare le directory iniziali per entrambe le finestre come
argomenti per MC; per esempio, "<code class="literal">mc /etc /root</code>". </p>
</li>
<li class="listitem">
<p><code class="literal">Esc</code> + <code class="literal">tasto n</code> → <code class="literal">Fn</code>
(cioè, <code class="literal">Esc</code> + <code class="literal">1</code> →
<code class="literal">F1</code>, ecc.; <code class="literal">Esc</code> + <code class="literal">0</code> →
<code class="literal">F10</code>) </p>
</li>
<li class="listitem">
<p> Premere <code class="literal">Esc</code> prima di un tasto ha lo stesso effetto di
premere <code class="literal">Alt</code> ed il tasto contemporaneamente; premere cioè
<code class="literal">Esc</code> + <code class="literal">c</code> per
<code class="literal">Alt-C</code>. <code class="literal">Esc</code> è chiamato meta-tasto ed è
a volte indicato con "<code class="literal">M-</code>". </p>
</li>
</ul>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_internal_editor_in_mc"/>1.3.5. L'editor interno di MC</h3>
</div>
</div>
</div>
<p>L'editor interno ha un interessante schema per il taglia e incolla. La
pressione di <code class="literal">F3</code> marca l'inizio di una selezione, una
seconda pressione di <code class="literal">F3</code> marca la fine della selezione e
la evidenzia. Si può poi muovere il cursore. Se si preme F6, l'area
selezionata viene spostata nella posizione del cursore. Se si preme F5
l'area selezionata viene copiata ed inserita alla posizione del
cursore. <code class="literal">F2</code> salva il file. <code class="literal">F10</code> fa
uscire. La maggior parte dei tasti cursore funziona in modo intuitivo.</p>
<p>Si può avviare direttamente questo editor su di un file usando uno dei
comandi seguenti.</p>
<pre class="screen">$ mc -e filename_to_edit</pre>
<pre class="screen">$ mcedit filename_to_edit</pre>
<p>Questo non è un editor multi-finestra, ma si possono usare più console Linux
per ottenere lo stesso effetto. Per copiare tra finestre, usare i tasti
Alt-F<span class="emphasis"><em>n</em></span> per cambiare console virtuale e usare
"File→Insert file" o "File→Copy to file" per spostare una porzione di un
file in un altro file.</p>
<p>Questo editor interno può essere rimpiazzato da qualsiasi editor esterno a
propria scelta.</p>
<p>Inoltre molti programmi usano la variabile d'ambiente
"<code class="literal">$EDITOR</code>" o "<code class="literal">$VISUAL</code>" per decidere
quale editor usare. Se inizialmente non ci si trova a proprio agio con
<code class="literal">vim</code>(1) o <code class="literal">nano</code>(1), si può impostare
queste variabili a "<code class="literal">mcedit</code>" aggiungendo le righe seguenti
al file "<code class="literal">~/.bashrc</code>".</p>
<pre class="screen">export EDITOR=mcedit
export VISUAL=mcedit</pre>
<p>Io raccomando di impostarle a "<code class="literal">vim</code>", se possibile.</p>
<p>Se non ci si trova a proprio agio con <code class="literal">vim</code>(1), si può
continuare ad usare <code class="literal">mcedit</code>(1) per la maggior parte dei
compiti di manutenzione del sistema.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_internal_viewer_in_mc"/>1.3.6. Il visualizzatore interno di MC</h3>
</div>
</div>
</div>
<p>MC è un visualizzatore molto intelligente. È un grande strumento per cercare
parole in documenti. Lo uso sempre per i file nella directory
"<code class="literal">/usr/share/doc</code>". È il metodo più veloce per navigare tra
una massa di informazioni Linux. Questo visualizzatore può essere avviato
direttamente usando uno dei comandi seguenti.</p>
<pre class="screen">$ mc -v path/to/filename_to_view</pre>
<pre class="screen">$ mcview path/to/filename_to_view</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_auto_start_features_of_mc"/>1.3.7. Funzionalità di avvio automatico di MC</h3>
</div>
</div>
</div>
<p>Se si preme Invio su di un file, un programma appropriato gestirà il
contenuto del file (vedere <a class="xref" href="ch09.it.html#_customizing_program_to_be_started" title="9.4.11. Personalizzare i programmi da avviare">Sezione 9.4.11, «Personalizzare i programmi da avviare»</a>). Questa è una funzionalità
molto comoda di MC.</p>
<div class="table">
<a id="thereactiontotheenterkeyinmc"/>
<p class="title">
<strong>Tabella 1.12. La reazione al tasto Invio in MC</strong>
</p>
<div class="table-contents">
<table class="table" summary="La reazione al tasto Invio in MC" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> tipo di file </th>
<th style="text-align: left"> reazione al tasto Invio </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> file eseguibile </td>
<td style="text-align: left"> esegue comando </td>
</tr>
<tr>
<td style="text-align: left"> file man </td>
<td style="text-align: left"> invia i contenuti tramite pipe al software di visualizzazione </td>
</tr>
<tr>
<td style="text-align: left"> file html </td>
<td style="text-align: left"> invia i contenuti tramite pipe al browser web </td>
</tr>
<tr>
<td style="text-align: left"> file "<code class="literal">*.tar.gz</code>" e "<code class="literal">*.deb</code>" </td>
<td style="text-align: left"> naviga i suoi contenuti come se fosse una sottodirectory </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Per far sì che queste funzionalità di visualizzazione dei file e di file
virtuali funzionino, i file visualizzabili non dovrebbero essere impostati
come eseguibili. Cambiare il loro stato usando <code class="literal">chmod</code>(1) o
attraverso il menu file di MC.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_virtual_filesystem_of_mc"/>1.3.8. File system virtuale di MC</h3>
</div>
</div>
</div>
<p>MC può essere usato per accedere a file in Internet. Premere
<code class="literal">F9</code> per andare nel menu, usare "<code class="literal">Invio</code>"
e "<code class="literal">h</code>" per attivare un file system Shell. Inserire un URL
nella forma
"<code class="literal">sh://[utente@]macchina[:opzioni]/[dir-remota]</code>", che
recupera la directory remota che apparirà come una directory locale usando
<code class="literal">ssh</code>.</p>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="_the_basic_unix_like_work_environment"/>1.4. Ambiente di lavoro di base in stile Unix</h2>
</div>
</div>
</div>
<p>Anche se MC permette di fare quasi tutto, è bene imparare come usare gli
strumenti a riga di comando invocati dal prompt di shell e prendere
familiarità con l'ambiente di lavoro in stile Unix.</p>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_login_shell"/>1.4.1. La shell di login</h3>
</div>
</div>
</div>
<p>Dato che la shell di login può essere utilizzata da alcuni programmi di
inizializzazione del sistema, è prudente mantenerla come
<code class="literal">bash</code>(1) e evitare di cambiare la shell di login in
<code class="literal">chsh</code>(1).</p>
<p>Se si desidera usare un prompt di shell interattiva diverso, impostarlo
dalla configurazione dell'emulatore di terminale in GUI o avviarlo da
<code class="literal">~/.bashrc</code>, ad esempio mettendoci "<code class="literal">exec
/usr/bin/zsh -i -l</code>" o "<code class="literal">exec /usr/bin/fish -i
-l</code>".</p>
<div class="table">
<a id="list-of-shell-programs"/>
<p class="title">
<strong>Tabella 1.13. Elenco di programmi shell</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di programmi shell" 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"> Shell POSIX </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/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"> Sì </td>
<td style="text-align: left"><a class="ulink" href="https://it.wikipedia.org/wiki/Bash">Bash</a>: GNU Bourne Again SHell (standard de facto) </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/bash-completion">
<code class="literal">bash-completion</code> </a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=bash-completion">V:31, I:926</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/b/bash-completion.html">1463</a>
</td>
<td style="text-align: left"> N/D </td>
<td style="text-align: left"> completamento programmabile per la shell <a class="ulink" href="https://it.wikipedia.org/wiki/Bash">bash</a> </td>
</tr>
<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"> Sì </td>
<td style="text-align: left"> Debian <a class="ulink" href="https://en.wikipedia.org/wiki/Almquist_shell">Almquist Shell</a>, buona per script
di shell </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/zsh"> <code class="literal">zsh</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=zsh">V:37, I:73</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/z/zsh.html">2436</a>
</td>
<td style="text-align: left"> Sì </td>
<td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Z_shell">Z shell</a>: la shell standard con molti
miglioramenti </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/tcsh"> <code class="literal">tcsh</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=tcsh">V:8, I:25</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/t/tcsh.html">1346</a>
</td>
<td style="text-align: left"> No </td>
<td style="text-align: left"> <a class="ulink" href="https://it.wikipedia.org/wiki/Tcsh">TENEX C Shell</a>: una versione migliorata di
<a class="ulink" href="https://en.wikipedia.org/wiki/C_shell">Berkeley csh</a></td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/mksh"> <code class="literal">mksh</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=mksh">V:6, I:13</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/m/mksh.html">1459</a>
</td>
<td style="text-align: left"> Sì </td>
<td style="text-align: left"> Una versione della <a class="ulink" href="https://it.wikipedia.org/wiki/Korn_shell">Korn shell</a> </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/csh"> <code class="literal">csh</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=csh">V:1, I:7</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/c/csh.html">340</a>
</td>
<td style="text-align: left"> No </td>
<td style="text-align: left"> C Shell <a class="ulink" href="https://it.wikipedia.org/wiki/OpenBSD">OpenBSD</a>, una versione di <a class="ulink" href="https://en.wikipedia.org/wiki/C_shell">Berkeley csh</a> </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/sash"> <code class="literal">sash</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=sash">V:0, I:6</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/s/sash.html">1158</a>
</td>
<td style="text-align: left"> Sì </td>
<td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Stand-alone_shell">Stand-alone shell</a> con comandi interni
(non adatta per essere la "<code class="literal">/bin/sh</code>" standard) </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/ksh"> <code class="literal">ksh</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=ksh">V:2, I:13</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/k/ksh.html">56</a>
</td>
<td style="text-align: left"> Sì </td>
<td style="text-align: left"> la versione reale di AT&T della <a class="ulink" href="https://it.wikipedia.org/wiki/Korn_shell">Korn
shell</a> </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/rc"> <code class="literal">rc</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=rc">V:0, I:1</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/r/rc.html">169</a>
</td>
<td style="text-align: left"> No </td>
<td style="text-align: left"> implementazione della <a class="ulink" href="https://it.wikipedia.org/wiki/Rc_shell">rc shell</a> di <a class="ulink" href="https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs">AT&T Plan 9</a> </td>
</tr>
<tr>
<td style="text-align: left">
<a class="ulink" href="http://packages.debian.org/sid/posh"> <code class="literal">posh</code>
</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://qa.debian.org/popcon-graph.php?packages=posh">V:0, I:0</a>
</td>
<td style="text-align: left">
<a class="ulink" href="http://packages.qa.debian.org/p/posh.html">190</a>
</td>
<td style="text-align: left"> Sì </td>
<td style="text-align: left"> Policy-compliant Ordinary SHell (derivata da <code class="literal">pdksh</code>) </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 le shell in stile POSIX condividano la stessa sintassi di base, esse
possono differire nel comportamento relativo a cose anche basilari, come le
variabili della shell e l'espansione dei modelli glob. Per i dettagli
controllare la loro documentazione.</p>
</td>
</tr>
</table>
</div>
<p>In questo capitolo del tutorial la shell interattiva considerata è sempre
<code class="literal">bash</code>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_customizing_bash"/>1.4.2. Personalizzare bash</h3>
</div>
</div>
</div>
<p>Si può personalizzare il comportamento di <code class="literal">bash</code>(1) con
"<code class="literal">~/.bashrc</code>".</p>
<p>Per esempio provare quanto segue.</p>
<pre class="screen"># enable bash-completion
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# CD upon exiting MC
. /usr/lib/mc/mc.sh
# set CDPATH to a good one
CDPATH=.:/usr/share/doc:~:~/Desktop:~
export CDPATH
PATH="${PATH+$PATH:}/usr/sbin:/sbin"
# set PATH so it includes user's private bin if it exists
if [ -d ~/bin ] ; then
PATH="~/bin${PATH+:$PATH}"
fi
export PATH
EDITOR=vim
export EDITOR</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>Si possono trovare altri suggerimenti sulla personalizzazione di
<span class="citerefentry"><span class="refentrytitle">bash</span>(1)</span>,
come <a class="xref" href="ch09.it.html#_colorized_commands" title="9.3.6. Comandi colorati">Sezione 9.3.6, «Comandi colorati»</a>, in <a class="xref" href="ch09.it.html" title="Capitolo 9. Suggerimenti per il sistema">Capitolo 9, <em>Suggerimenti per il sistema</em></a>.</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>Il pacchetto <code class="literal">bash-completion</code> permette il completamento
automatico per <code class="literal">bash</code>.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_special_key_strokes"/>1.4.3. Associazioni di tasti speciali</h3>
</div>
</div>
</div>
<p>Nell'ambiente <a class="ulink" href="https://it.wikipedia.org/wiki/Unix-like">*nix</a>, ci sono alcune
associazioni di tasti che hanno un significato speciale. Notare che in una
console a caratteri Linux normale solo i tasti <code class="literal">Ctrl</code> e
<code class="literal">Alt</code>sinistri funzionano come atteso. Ecco alcune
combinazioni di tasti che vale la pena ricordare.</p>
<div class="table">
<a id="listofkeybindingsforbash"/>
<p class="title">
<strong>Tabella 1.14. Elenco di associazioni di tasti per bash</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di associazioni di tasti per bash" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> tasto </th>
<th style="text-align: left"> descrizione dell'associazione di tasti </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-U</code> </td>
<td style="text-align: left"> cancella il contenuto della riga prima del cursore </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-H</code> </td>
<td style="text-align: left"> cancella il carattere prima del cursore </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-D</code> </td>
<td style="text-align: left"> termina l'input (se si sta usando la shell, esce dalla shell) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-C</code> </td>
<td style="text-align: left"> termina un programma in esecuzione </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-Z</code> </td>
<td style="text-align: left"> arresta temporaneamente un programma spostandolo come compito sullo sfondo </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-S</code> </td>
<td style="text-align: left"> ferma l'output a schermo. </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-Q</code> </td>
<td style="text-align: left"> riattiva l'output a schermo. </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-Alt-Del</code> </td>
<td style="text-align: left"> riavvia/ferma il sistema, vedere <code class="literal">inittab</code>(5) </td>
</tr>
<tr>
<td style="text-align: left"><code class="literal">Left-Alt-key</code> (opzionalmente, <code class="literal">tasto
Windows</code>) </td>
<td style="text-align: left"> meta-tasto per Emacs e interfacce utente simili </td>
</tr>
<tr>
<td style="text-align: left"> freccia in su </td>
<td style="text-align: left"> avvia la ricerca nello storico dei comandi in <code class="literal">bash</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-R</code> </td>
<td style="text-align: left"> inizia una ricerca incrementale nello storico dei comandi in
<code class="literal">bash</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Tab</code> </td>
<td style="text-align: left"> completa l'input di un nome di file nella riga di comando in
<code class="literal">bash</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-V</code> <code class="literal">Tab</code> </td>
<td style="text-align: left"> inserisce in input un carattere <code class="literal">Tab</code> senza espansione
nella riga di comando in <code class="literal">bash</code> </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>La funzionalità di <code class="literal">Ctrl-S</code> nel terminale può essere
disabilitata usando <code class="literal">stty</code>(1).</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_mouse_operations"/>1.4.4. Operazioni del mouse</h3>
</div>
</div>
</div>
<p><a class="ulink" href="https://specifications.freedesktop.org/clipboards-spec/clipboards-latest.txt">Il funzionamento del mouse
per il testo nel sistema Debian mescola 2 stile</a> con alcune
peculiarità:</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>Funzioni del mouse in stile Unix tradizionali:</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>uso di 3 pulsanti (clic) </p>
</li>
<li class="listitem">
<p>uso di PRIMARY (principale) </p>
</li>
<li class="listitem">
<p>usato da applicazioni X come <code class="literal">xterm</code> e applicazioni
testuali nella console Linux </p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p>Funzionamento del mouse moderno in stile GUI:</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>uso di 2 pulsanti (trascina e clic) </p>
</li>
<li class="listitem">
<p>uso di PRIMARY (principale) e CLIPBOARD (appunti) </p>
</li>
<li class="listitem">
<p>usato in applicazioni GUI moderne come <code class="literal">gnome-terminal</code> </p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="table">
<a id="listofmouseoperayactionsondebian"/>
<p class="title">
<strong>Tabella 1.15. Elenco di funzioni del mouse e relative azioni dei tasti in Debian </strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di funzioni del mouse e relative azioni dei tasti in Debian " border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> azione </th>
<th style="text-align: left"> risposta </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> Clic sinistro e trascinamento </td>
<td style="text-align: left"> marca l'intervallo della selezione PRINCIPALE </td>
</tr>
<tr>
<td style="text-align: left"> Clic sinistro </td>
<td style="text-align: left"> marca l'inizio dell'intervallo per la selezione PRINCIPALE </td>
</tr>
<tr>
<td style="text-align: left"> Clic destro (tradizionale) </td>
<td style="text-align: left"> marca la fine dell'intervallo per la selezione PRINCIPALE </td>
</tr>
<tr>
<td style="text-align: left"> Clic destro (moderno) </td>
<td style="text-align: left"> menu dipendente dal contesto (taglia/copia/incolla) </td>
</tr>
<tr>
<td style="text-align: left"> Clic di mezzo o Maiusc-<code class="literal">Ins</code> </td>
<td style="text-align: left"> inserisce la selezione PRINCIPALE alla posizione del cursore </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-X</code> </td>
<td style="text-align: left"> taglia la selezione PRINCIPALE negli APPUNTI </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-C</code> (<code class="literal">Shift-Ctrl-C</code> nel terminale) </td>
<td style="text-align: left"> copia la selezione PRINCIPALE negli APPUNTI </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">Ctrl-V</code> </td>
<td style="text-align: left"> incolla gli APPUNTI alla posizione del cursore </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Qui, la selezione PRINCIPALE è l'intervallo di testo
evidenziato. All'interno del programma di terminale viene usato invece
<code class="literal">Shift-Ctrl-C</code> per evitare di terminare un programma in
esecuzione.</p>
<p>La rotella centrale presente nei mouse moderni viene considerata come il
pulsante di mezzo e può essere usata per fare il corrispondente
clic. Cliccare contemporaneamente con i pulsanti destro e sinistro funziona
da clic di mezzo nelle situazioni in cui si hanno mouse a 2 pulsanti.</p>
<p>Per poter usare il mouse in una console a caratteri Linux, è necessario che
<code class="literal">gpm</code>(8) sia in esecuzione come demone.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_pager"/>1.4.5. Il paginatore</h3>
</div>
</div>
</div>
<p>Il comando <code class="literal">less</code>(1) è il paginatore (navigatore del
contenuto dei file) migliorato. Legge il file specificato nell'argomento del
comando o il suo standard input. Premere "<code class="literal">h</code>" se si ha
bisogno di aiuto nella navigazione con il comando
<code class="literal">less</code>. Può fare molto di più di <code class="literal">more</code>(1)
e può essere fornito di superpoteri eseguendo "<code class="literal">eval
$(lesspipe)</code>" o "<code class="literal">eval $(lessfile)</code>" nello script
di avvio della shell. Vedere ulteriori informazioni in
"<code class="literal">/usr/share/doc/less/LESSOPEN</code>". L'opzione
"<code class="literal">-R</code>" permette output raw e abilita le sequenze di escape
ANSI per i colori. Vedere <code class="literal">less</code>(1).</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_text_editor"/>1.4.6. L'editor di testo</h3>
</div>
</div>
</div>
<p>Si dovrebbe diventare competenti in una delle varianti dei programmi <a class="ulink" href="https://it.wikipedia.org/wiki/Vim_(editor_di_testo)">Vim</a> o <a class="ulink" href="https://it.wikipedia.org/wiki/Emacs">Emacs</a> che sono
popolari sui sistemi *nix.</p>
<p>Penso che abituarsi ai comandi Vim sia la cosa giusta da fare, dato che un
editor Vi è sempre presente nel mondo Linux/Unix. (In realtà, il
<code class="literal">vi</code> originale o il nuovo <code class="literal">nvi</code> sono
programmi che si trovano ovunque. Io ho scelto invece Vim per i principianti
dato che offre l'aiuto attraverso il tasto <code class="literal">F1</code> pur essendo
abbastanza simile e più potente.)</p>
<p>Se si sceglie invece <a class="ulink" href="https://it.wikipedia.org/wiki/Emacs">Emacs</a> o <a class="ulink" href="https://it.wikipedia.org/wiki/XEmacs">XEmacs</a> come editor preferito, si sta facendo comunque
davvero un'ottima scelta, specialmente per la programmazione. Emacs ha una
vastità di altre funzionalità, incluso il funzionamento come newsreader,
editor di directory, programma di posta, ecc. Quando usato per la
programmazione o la scrittura di script, riconosce intelligentemente il
formato che si sta usando e cerca di fornire assistenza. Alcune persone
sostengono che l'unico programma di cui hanno bisogno su Linux è
Emacs. Dieci minuti spesi ad imparare Emacs ora possono far risparmiare ore
in futuro. È caldamente raccomandato avere a portata di mano il manuale di
GNU Emacs da consultare quando si sta imparando Emacs.</p>
<p>Tutti questi programmi sono di solito forniti con un programma tutor che
aiuta ad impararli facendo pratica. Avviare Vim digitando
"<code class="literal">vim</code>" e premere il tasto F1. Si dovrebbero leggere come
minimo le prime 35 righe. Poi seguire il corso di apprendimento in linea
muovendo il cursore su "<code class="literal">|tutor|</code>" e premendo
<code class="literal">Ctrl-]</code>.</p>
<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>I buoni editor, come Vim ed Emacs, possono gestire correttamente testi UTF-8
e testi in altre codifiche esotiche. È opportuno usare l'ambiente GUI con la
localizzazione UTF-8 e installare i programmi e i tipi di carattere
necessari. Gli editor hanno opzioni per impostare la codifica dei file
indipendentemente dall'ambiente GUI. Fare riferimento alla loro
documentazione sui testi multibyte.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_setting_a_default_text_editor"/>1.4.7. Impostare un editor di testi predefinito</h3>
</div>
</div>
</div>
<p>Debian è fornita con svariati editor differenti. Si raccomanda di
installare, come detto in precedenza, il pacchetto <code class="literal">vim</code>.</p>
<p>Debian fornisce un accesso unificato all'editor predefinito di sistema
attraverso il comando "<code class="literal">/usr/bin/editor</code>" in modo che altri
programmi (ad esempio <code class="literal">reportbug</code>(1)) possano
richiamarlo. Lo si può modificare con il comando seguente.</p>
<pre class="screen">$ sudo update-alternatives --config editor</pre>
<p>Io raccomando ai principianti la scelta di
"<code class="literal">/usr/bin/vim.basic</code>" invece
di"<code class="literal">/usr/bin/vim.tiny</code>" dato che supporta l'evidenziazione
della sintassi.</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>Molti programmi usano la variabile d'ambiente "<code class="literal">$EDITOR</code>" o
"<code class="literal">$VISUAL</code>" per decidere quale editor usare (vedere<a class="xref" href="ch01.it.html#_the_internal_editor_in_mc" title="1.3.5. L'editor interno di MC">Sezione 1.3.5, «L'editor interno di MC»</a> e <a class="xref" href="ch09.it.html#_customizing_program_to_be_started" title="9.4.11. Personalizzare i programmi da avviare">Sezione 9.4.11, «Personalizzare i programmi da avviare»</a>. Per coerenza, in un sistema
Debian, impostare queste variabili a
"<code class="literal">/usr/bin/editor</code>". (Storicamente
"<code class="literal">$EDITOR</code>" era "<code class="literal">ed</code>" e
"<code class="literal">$VISUAL</code>" era "<code class="literal">vi</code>".)</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_using_vim"/>1.4.8. Usare vim</h3>
</div>
</div>
</div>
<p><code class="literal">vim</code>(1) recente si avvia con la sana opzione
"<code class="literal">nocompatible</code>" e entra nella modalità
<code class="literal">NORMAL</code>.<a href="#ftn.idm2036" class="footnote" id="idm2036"><sup class="footnote">[1]</sup></a> </p>
<div class="table">
<a id="listofbasicvimkeystrokes"/>
<p class="title">
<strong>Tabella 1.16. Elenco di combinazioni di tasti base di Vim</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di combinazioni di tasti base di Vim" 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"> modalità </th>
<th style="text-align: left"> Combinazione di tasti </th>
<th style="text-align: left"> azione </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:help|only</code> </td>
<td style="text-align: left"> visualizza il file di aiuto </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:e nomefile.ext</code> </td>
<td style="text-align: left"> apre un nuovo buffer per modificare <code class="literal">nomefile.ext</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:w</code> </td>
<td style="text-align: left"> sovrascrive il buffer corrente sul file originale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:w nomefile.ext</code> </td>
<td style="text-align: left"> scrive il buffer corrente su <code class="literal">nomefile.ext</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:q</code> </td>
<td style="text-align: left"> esce da <code class="literal">vim</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:q!</code> </td>
<td style="text-align: left"> forza l'uscita da <code class="literal">vim</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:only</code> </td>
<td style="text-align: left"> chiude tutte le altre finestre staccate aperte </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:set nocompatible?</code> </td>
<td style="text-align: left"> controlla se <code class="literal">vim</code> è nella sana modalità
<code class="literal">nocompatible</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:set nocompatible</code> </td>
<td style="text-align: left"> imposta <code class="literal">vim</code> nella sana modalità
<code class="literal">nocompatible</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">i</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">INSERT</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">R</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">REPLACE</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">v</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">VISUAL</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">V</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">VISUAL</code> a righe </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> Ctrl-<code class="literal">V</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">VISUAL</code> a blocchi </td>
</tr>
<tr>
<td style="text-align: left"> tranne <code class="literal">TERMINAL-JOB</code> </td>
<td style="text-align: left"> <code class="literal">ESC</code>-key </td>
<td style="text-align: left"> entra nella modalità <code class="literal">NORMAL</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">NORMALE</code> </td>
<td style="text-align: left"> <code class="literal">:term</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">TERMINAL-JOB</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">TERMINAL-NORMAL</code> </td>
<td style="text-align: left"> <code class="literal">i</code> </td>
<td style="text-align: left"> entra nella modalità <code class="literal">TERMINAL-JOB</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">TERMINAL-JOB</code> </td>
<td style="text-align: left"> Ctrl-<code class="literal">W</code> <code class="literal">N</code> (o Ctrl-<code class="literal">\</code>
Ctrl-<code class="literal">N</code>) </td>
<td style="text-align: left"> entra nella modalità <code class="literal">TERMINAL-NORMAL</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">TERMINAL-JOB</code> </td>
<td style="text-align: left"> Ctrl-<code class="literal">W</code> <code class="literal">:</code> </td>
<td style="text-align: left"> entra nella <code class="literal">Ex</code>-mode nella modalità
<code class="literal">TERMINAL-NORMAL</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p> Usare il programma "<code class="literal">vimtutor</code>" per imparare ad usare
<code class="literal">vim</code> attraverso un corso tutorial interattivo. </p>
<p> Il programma <code class="literal">vim</code> cambia il suo comportamento in risposta
ai tasti premuti in base alla <span class="strong"><strong>modalità
(mode)</strong></span>. La digitazione con i tasti nel buffer è fatta soprattutto
in modalità <code class="literal">INSERT</code> e in modalità
<code class="literal">REPLACE</code>. Spostare il cursore viene fatto soprattutto in
modalità <code class="literal">NORMAL</code>. La selezione interattiva viene fatta in
modalità <code class="literal">VISUAL</code>. Se si digita "<code class="literal">:</code>" in
modalità <code class="literal">NORMAL</code> si cambia la sua <span class="strong"><strong>modalità</strong></span> in
<code class="literal">Ex</code>-mode. <code class="literal">Ex</code>-mode accetta comandi.</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>Vim viene distribuito con il pacchetto <span class="strong"><strong>Netrw</strong></span>. Netrw supporta lettura e scrittura di file,
navigazione di directory in una rete e navigazione locale! Provare Netrw con
"<code class="literal">vim .</code>" (un punto come argomento) e leggere il suo
manuale con "<code class="literal">:help netrw</code>". </p>
</td>
</tr>
</table>
</div>
<p> Per la configurazione avanzata di <code class="literal">vim</code>, vedere <a class="xref" href="ch09.it.html#_customizing_vim" title="9.2. Personalizzare vim">Sezione 9.2, «Personalizzare vim»</a>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_recording_the_shell_activities"/>1.4.9. Registrare le attività della shell</h3>
</div>
</div>
</div>
<p>L'output dei comandi di shell può scorrere fuori dallo schermo e potrebbe
essere perduto per sempre. È buona norma registrare le attività di shell in
un file in modo da poterle riguardare in seguito. Questo tipo di registro è
essenziale quando si fa una qualsiasi attività di amministrazione del
sistema.</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>Il nuovo Vim (versione>=8.2) può essere utilizzato per registrare in modo
pulito le attività di shell usando la modalità
<code class="literal">TERMINAL-JOB</code>. Vedere <a class="xref" href="ch01.it.html#_using_vim" title="1.4.8. Usare vim">Sezione 1.4.8, «Usare vim»</a>.</p>
</td>
</tr>
</table>
</div>
<p>Il metodo base per registrare l'attività di shell è di eseguirla sotto
<code class="literal">script</code>(1).</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ script
Script started, file is typescript</pre>
<p>Eseguire qualsiasi comando di shell sotto <code class="literal">script</code>.</p>
<p>Premere <code class="literal">Ctrl-D</code> per uscire da <code class="literal">script</code>.</p>
<pre class="screen">$ vim typescript</pre>
<p>Vedere <a class="xref" href="ch09.it.html#_recording_the_shell_activities_cleanly" title="9.1.1. Registrare le attività della shell in modo pulito">Sezione 9.1.1, «Registrare le attività della shell in modo pulito»</a>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_basic_unix_commands"/>1.4.10. Comandi Unix di base</h3>
</div>
</div>
</div>
<p>È bene imparare i comandi Unix di base. Il termine "Unix" è qui usato in
senso lato; ogni SO clone di Unix offre di solito comandi equivalenti. Il
sistema Debian non fa eccezione. Non ci si preoccupi se, al momento, alcuni
comandi non funzionano come si vorrebbe. Se si usa <code class="literal">alias</code>
nella shell, i corrispondenti output dei comandi sono diversi. Questi esempi
non sono pensati per essere eseguiti necessariamente in questo ordine.</p>
<p>Provare tutti i comandi seguenti da un account utente non privilegiato.</p>
<div class="table">
<a id="listofbasicunixcommands"/>
<p class="title">
<strong>Tabella 1.17. Elenco di comandi Unix di base</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di comandi Unix di base" 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 </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">pwd</code> </td>
<td style="text-align: left"> mostra il nome della directory attuale/di lavoro </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">whoami</code> </td>
<td style="text-align: left"> mostra il nome dell'utente attuale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">id</code> </td>
<td style="text-align: left"> mostra l'identità dell'utente attuale (nome, uid, gid e gruppi associati) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">file <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> mostra che tipo di file sia il file
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">type -p <span class="emphasis"><em>nomecomando</em></span></code> </td>
<td style="text-align: left"> mostra la posizione del file del comando
"<code class="literal"><span class="emphasis"><em>nomecomando</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">which <span class="emphasis"><em>nomecomando</em></span></code> </td>
<td style="text-align: left"> " " </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">type <span class="emphasis"><em>nomecomando</em></span></code> </td>
<td style="text-align: left"> mostra informazioni sul comando
"<code class="literal"><span class="emphasis"><em>nomecomando</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">apropos <span class="emphasis"><em>parola-chiave</em></span></code> </td>
<td style="text-align: left"> trova comandi riguardanti
"<code class="literal"><span class="emphasis"><em>parola-chiave</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">man -k <span class="emphasis"><em>parola-chiave</em></span></code> </td>
<td style="text-align: left"> " " </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">whatis <span class="emphasis"><em>nomecomando</em></span></code> </td>
<td style="text-align: left"> mostra una spiegazione di una riga sul comando
"<code class="literal"><span class="emphasis"><em>nomecomando</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">man -a <span class="emphasis"><em>nomecomando</em></span></code> </td>
<td style="text-align: left"> mostra una spiegazione del comando
"<code class="literal"><span class="emphasis"><em>nomecomando</em></span></code>" (in stile Unix) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">info <span class="emphasis"><em>nomecomando</em></span></code> </td>
<td style="text-align: left"> mostra una spiegazione piuttosto lunga del comando
"<code class="literal"><span class="emphasis"><em>nomecomando</em></span></code>" (in stile GNU) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ls</code> </td>
<td style="text-align: left"> elenca il contenuto di directory (non i file punto e le directory) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ls -a</code> </td>
<td style="text-align: left"> elenca il contenuto di directory (tutti i file e directory) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ls -A</code> </td>
<td style="text-align: left"> elenca il contenuto di directory (quasi tutti i file e directory, cioè salta
"<code class="literal">..</code>" e "<code class="literal">.</code>") </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ls -la</code> </td>
<td style="text-align: left"> elenca tutto il contenuto di directory con informazioni dettagliate </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ls -lai</code> </td>
<td style="text-align: left"> elenca tutto il contenuto di directory con numeri di inode e informazioni
dettagliate </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ls -d</code> </td>
<td style="text-align: left"> elenca tutte le directory dentro la directory attuale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tree</code> </td>
<td style="text-align: left"> mostra il contenuto in forma di albero </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">lsof <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> mostra lo stato aperto per il file
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">lsof -p <span class="emphasis"><em>pid</em></span></code> </td>
<td style="text-align: left"> mostra i file aperti dal processo con ID
"<code class="literal"><span class="emphasis"><em>pid</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">mkdir <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> crea una nuova directory "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>"
nella directory attuale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">rmdir <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> rimuove la directory "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" nella
directory attuale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" nella directory attuale o in
una directory elencata nella variabile "<code class="literal">$CDPATH</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd /</code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory radice </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd</code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory home dell'utente </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd /<span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory con percorso assoluto
"<code class="literal">/<span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd ..</code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory genitore </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd ~<span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory home dell'utente
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cd -</code> </td>
<td style="text-align: left"> cambia directory spostandosi nella directory precedente </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal"></etc/motd pager</code> </td>
<td style="text-align: left"> mostra il contenuto di "<code class="literal">/etc/motd</code>" usando il paginatore
predefinito </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">touch <span class="emphasis"><em>filediprova</em></span></code> </td>
<td style="text-align: left"> crea un file "<code class="literal"><span class="emphasis"><em>filediprova</em></span></code>" vuoto </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">cp <span class="emphasis"><em>pippo</em></span> <span class="emphasis"><em>pluto</em></span></code> </td>
<td style="text-align: left"> copia un file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente in
un nuovo file "<code class="literal"><span class="emphasis"><em>pluto</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">rm <span class="emphasis"><em>filediprova</em></span></code> </td>
<td style="text-align: left"> rimuove il file "<code class="literal"><span class="emphasis"><em>filediprova</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">mv <span class="emphasis"><em>pippo</em></span> <span class="emphasis"><em>pluto</em></span></code> </td>
<td style="text-align: left"> rinomina un file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente
con il nuovo nome "<code class="literal"><span class="emphasis"><em>pluto</em></span></code>"
("<code class="literal"><span class="emphasis"><em>pluto</em></span></code>" non deve esistere) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">mv <span class="emphasis"><em>pippo</em></span> <span class="emphasis"><em>pluto</em></span></code> </td>
<td style="text-align: left"> muove un file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente
nella nuova posizione
"<code class="literal"><span class="emphasis"><em>pluto</em></span>/<span class="emphasis"><em>pippo</em></span></code>"
(la directory "<code class="literal"><span class="emphasis"><em>pluto</em></span></code>" deve esistere) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">mv <span class="emphasis"><em>pippo</em></span>
<span class="emphasis"><em>pluto</em></span>/<span class="emphasis"><em>paperino</em></span></code> </td>
<td style="text-align: left"> muove un file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente in
una nuova posizione con il nuovo nome
"<code class="literal"><span class="emphasis"><em>pluto</em></span>/<span class="emphasis"><em>paperino</em></span></code>"
(la directory "<code class="literal"><span class="emphasis"><em>pluto</em></span></code>" deve esistere
ma non deve esistere
"<code class="literal"><span class="emphasis"><em>bar</em></span>/<span class="emphasis"><em>baz</em></span></code>") </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">chmod 600 <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> fa sì che il file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente
sia non leggibile e non scrivibile da altri (e non eseguibile per nessuno) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">chmod 644 <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> fa sì che il file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente
sia leggibile ma non scrivibile da altri (e non eseguibile per nessuno) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">chmod 755 <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> fa sì che il file "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" esistente
sia leggibile ma non scrivibile da altri (ed eseguibile per tutti) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">find . -name <span class="emphasis"><em>modello</em></span></code> </td>
<td style="text-align: left"> trova nomi di file corrispondenti al
"<code class="literal"><span class="emphasis"><em>modello</em></span></code>" di shell (lento) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">locate -d . <span class="emphasis"><em>modello</em></span></code> </td>
<td style="text-align: left"> trova nomi di file corrispondenti al
"<code class="literal"><span class="emphasis"><em>pattern</em></span></code>" di shell (più veloce, usa
un database generato regolarmente) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">grep -e "<span class="emphasis"><em>modello</em></span>" *.html</code> </td>
<td style="text-align: left"> trova un "<code class="literal"><span class="emphasis"><em>modello</em></span></code>" in tutti i file
nella directory attuale che terminano con "<code class="literal">.html</code>" e
mostra tutte le corrispondenze </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">top</code> </td>
<td style="text-align: left"> mostra informazioni sui processi a tutto schermo, digitare
"<code class="literal">q</code>" per uscire </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ps aux | pager</code> </td>
<td style="text-align: left"> mostra informazioni su tutti i processi in esecuzione usando output in stile
BSD </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ps -ef | pager</code> </td>
<td style="text-align: left"> mostra informazioni su tutti i processi in esecuzione usando output in stile
system V Unix </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ps aux | grep -e "[e]xim4*"</code> </td>
<td style="text-align: left"> mostra tutti i processi che stanno eseguendo "<code class="literal">exim</code>" e
"<code class="literal">exim4</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ps axf | pager</code> </td>
<td style="text-align: left"> mostra informazioni su tutti i processi in esecuzione usando output in ASCII
art </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">kill <span class="emphasis"><em>1234</em></span></code> </td>
<td style="text-align: left"> uccide un processo identificato dall'ID "<span class="emphasis"><em>1234</em></span>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">gzip <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> comprime <code class="literal"><span class="emphasis"><em>pippo</em></span></code>" per creare
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.gz</code>", usando la codifica
Lempel-Ziv (LZ77) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">gunzip <span class="emphasis"><em>pippo</em></span>.gz</code> </td>
<td style="text-align: left"> decomprime "<code class="literal"><span class="emphasis"><em>pippo</em></span>.gz</code>" per creare
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">bzip2 <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> comprime "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" per creare
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.bz2</code>", usando l'algoritmo
Burrows-Wheeler per la compressione di testo con ordinamento di blocchi e la
codifica Huffman (compressione migliore di <code class="literal">gzip</code>) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">bunzip2 <span class="emphasis"><em>pippo</em></span>.bz2</code> </td>
<td style="text-align: left"> decomprime "<code class="literal"><span class="emphasis"><em>pippo</em></span>.bz2</code>" per creare
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">xz <span class="emphasis"><em>pippo</em></span></code> </td>
<td style="text-align: left"> comprime "<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" per creare
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.xz</code>", usando l'algoritmo
Lempel–Ziv–Markov chain (compressione migliore di <code class="literal">bzip2</code>) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">unxz <span class="emphasis"><em>pippo</em></span>.xz</code> </td>
<td style="text-align: left"> decomprime "<code class="literal"><span class="emphasis"><em>pippo</em></span>.xz</code>" per creare
"<code class="literal"><span class="emphasis"><em>pippo</em></span></code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -xvf <span class="emphasis"><em>pippo</em></span>.tar</code> </td>
<td style="text-align: left"> estrae i file dall'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -xvzf <span class="emphasis"><em>pippo</em></span>.tar.gz</code> </td>
<td style="text-align: left"> estrae file dall'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar.gz</code>" compresso con gzip </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -xvjf <span class="emphasis"><em>pippo</em></span>.tar.bz2</code> </td>
<td style="text-align: left"> estrae file dall'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar.bz2</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -xvJf <span class="emphasis"><em>pippo</em></span>.tar.xz</code> </td>
<td style="text-align: left"> estrae file dall'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar.xz</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -cvf <span class="emphasis"><em>pippo</em></span>.tar
<span class="emphasis"><em>pluto</em></span>/</code> </td>
<td style="text-align: left"> archivia i contenuti della directory
"<code class="literal"><span class="emphasis"><em>pluto</em></span>/</code>" nell'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -cvzf <span class="emphasis"><em>pippo</em></span>.tar.gz
<span class="emphasis"><em>pluto</em></span>/</code> </td>
<td style="text-align: left"> archivia i contenuti della directory
"<code class="literal"><span class="emphasis"><em>pluto</em></span>/</code>" nell'archivio compresso
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar.gz</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -cvjf <span class="emphasis"><em>pippo</em></span>.tar.bz2
<span class="emphasis"><em>pluto</em></span>/</code> </td>
<td style="text-align: left"> archivia i contenuti della directory
"<code class="literal"><span class="emphasis"><em>plutor</em></span>/</code>" nell'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar.bz2</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">tar -cvJf <span class="emphasis"><em>pippo</em></span>.tar.xz
<span class="emphasis"><em>pluto</em></span>/</code> </td>
<td style="text-align: left"> archivia i contenuti della directory
"<code class="literal"><span class="emphasis"><em>plutor</em></span>/</code>" nell'archivio
"<code class="literal"><span class="emphasis"><em>pippo</em></span>.tar.xz</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">zcat README.gz | pager</code> </td>
<td style="text-align: left"> mostra i contenuti del file compresso "<code class="literal">README.gz</code>" usando
il paginatore predefinito </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">zcat README.gz > pippo</code> </td>
<td style="text-align: left"> crea un file "<code class="literal">pippo</code> con i contenuti di
"<code class="literal">README.gz</code>" decompressi </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">zcat README.gz >> pippo</code> </td>
<td style="text-align: left"> aggiunge i contenuti di "<code class="literal">README.gz</code>" decompressi in coda
al file "<code class="literal">pippo</code>" (se il file non esiste, lo crea) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<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>Unix tradizionalmente nasconde i nomi di file che iniziano con
"<code class="literal">.</code>". Sono tradizionalmente file contenenti informazioni
di configurazione e preferenze dell'utente.</p>
<p>Per il comando <code class="literal">cd</code> vedere <code class="literal">builtins</code>(7).</p>
<p>Il paginatore predefinito del sistema di base di Debian è
<code class="literal">more</code>(1) che non ha lo scorrimento
all'indietro. Installando il pacchetto <code class="literal">less</code>, con la riga
di comando "<code class="literal">apt-get install less</code>",
<code class="literal">less</code>(1) diventa il paginatore predefinito e si può così
scorrere il testo all'indietro usando i tasti freccia.</p>
<p>I caratteri "<code class="literal">[</code>" e "<code class="literal">]</code>" nella
espressione regolare del comando "<code class="literal">ps aux | grep -e
"[e]xim4*"</code>" sopra citato, permettono a <code class="literal">grep</code> di
evitare di trovare corrispondenza con sé stesso. La parte
"<code class="literal">4*</code>" nella espressione regolare significa 0 o più
ripetizioni del carattere "<code class="literal">4</code>" e perciò permette a
<code class="literal">grep</code> di trovare corrispondenza sia con
"<code class="literal">exim</code>" sia con "<code class="literal">exim4</code>". Sebbene il
carattere "<code class="literal">*</code>" sia usato nei nomi di file con
metacaratteri della shell e nelle espressioni regolari, il suo significato è
diverso nei due casi. Si possono imparare le espressioni regolari da
<code class="literal">grep</code>(1).</p>
</td>
</tr>
</table>
</div>
<p>Come esercizio, esplorare le directory e dare un'occhiata al sistema usando
i comandi citati sopra. Se si hanno domande su uno qualsiasi dei comandi in
console, assicurarsi di leggere la pagina di manuale.</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ man man
$ man bash
$ man builtins
$ man grep
$ man ls</pre>
<p>Può essere un po' difficile abituarsi allo stile delle pagine man perché
sono piuttosto concise, in particolar modo le più vecchie e
tradizionali. Una volta che ci si fa la mano, però, si apprezza la loro
concisione.</p>
<p>Notare che molti comandi in stile Unix, inclusi quelli da GNU e BSD,
mostrano una breve informazione di aiuto se li si invoca in uno dei modi
seguenti (o in alcuni casi se lo si fa senza usare opzioni).</p>
<pre class="screen">$ <span class="emphasis"><em>commandname</em></span> --help
$ <span class="emphasis"><em>commandname</em></span> -h</pre>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="_the_simple_shell_command"/>1.5. Il semplice comando di shell</h2>
</div>
</div>
</div>
<p>Ora si ha un'idea di come usare il sistema Debian; è tempo di dare uno
sguardo più approfondito al meccanismo di esecuzione dei comandi nel sistema
Debian. Qui la realtà è stata semplificata ad uso del principiante. Vedere
<code class="literal">bash</code>(1) per una spiegazione esatta.</p>
<p>Un semplice comando è formato da una sequenza di componenti.</p>
<div class="orderedlist">
<ol class="orderedlist">
<li class="listitem">
<p> Assegnazioni di variabili (opzionale) </p>
</li>
<li class="listitem">
<p> Nome del comando </p>
</li>
<li class="listitem">
<p> Opzioni (opzionali) </p>
</li>
<li class="listitem">
<p> Ridirezioni (opzionali, <code class="literal">></code> ,
<code class="literal">>></code> , <code class="literal"><</code> ,
<code class="literal"><<</code> , ecc.) </p>
</li>
<li class="listitem">
<p> Operatori di controllo (opzionale, <code class="literal">&&</code> ,
<code class="literal">||</code> , <span class="emphasis"><em>a-capo</em></span> , <code class="literal">;</code> ,
<code class="literal">&</code> , <code class="literal">(</code> , <code class="literal">)</code> ) </p>
</li>
</ol>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_command_execution_and_environment_variable"/>1.5.1. Esecuzione dei comandi e variabili d'ambiente</h3>
</div>
</div>
</div>
<p>I valori di alcune <a class="ulink" href="https://en.wikipedia.org/wiki/Environment_variable">variabili
d'ambiente</a> cambiano il comportamento di alcuni comandi Unix.</p>
<p>I valori predefiniti delle variabili d'ambiente sono impostati inizialmente
dal sistema PAM e poi alcuni di essi possono essere reimpostati da alcuni
programmi applicativi.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Il sistema PAM come <code class="literal">pam_env</code> può impostare variabili
d'ambiente con <code class="literal">/etc/pam.conf</code>",
"<code class="literal">/etc/environment</code>" e
"<code class="literal">/etc/default/locale</code>". </p>
</li>
<li class="listitem">
<p> Il display manager, come <code class="literal">gdm3</code> può reimpostare variabili
d'ambiente per la sessione GUI con "<code class="literal">~/.profile</code>". </p>
</li>
<li class="listitem">
<p> L'inizializzazione dei programmi specifica per l'utente può reimpostare
variabili d'ambiente con "<code class="literal">~/.profile</code>",
"<code class="literal">~/.bash_profile</code>" e "<code class="literal">~/.bashrc</code>". </p>
</li>
</ul>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_literal_lang_literal_variable"/>1.5.2. La variabile "<code class="literal">$LANG</code>"</h3>
</div>
</div>
</div>
<p>La localizzazione predefinita è definita nella variabile d'ambiente
"<code class="literal">$LANG</code>" ed è configurata nella forma
"<code class="literal">LANG=xx_YY.UTF-8</code>" dall'installatore o dalla successiva
configurazione della GUI, es. "Impostazioni" → "Regione e lingua" → "Lingua"
/ "Formati" per GNOME.</p>
<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>Io raccomando di configurare l'ambiente di sistema usando per il momento
solo la variabile "<code class="literal">$LANG</code>" e di tenersi alla larga dalle
variabili "<code class="literal">$LC_*</code>" a meno che non sia strettamente
necessario.</p>
</td>
</tr>
</table>
</div>
<p>Il valore completo di localizzazione impostato nella variabile
"<code class="literal">$LANG</code>" consiste di 3 parti:
"<code class="literal">xx_YY.ZZZZ</code>".</p>
<div class="table">
<a id="thedpartsoflocalevalue"/>
<p class="title">
<strong>Tabella 1.18. Le 3 parti del valore di localizzazione</strong>
</p>
<div class="table-contents">
<table class="table" summary="Le 3 parti del valore di localizzazione" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> valore di localizzazione </th>
<th style="text-align: left"> significato </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">xx</code> </td>
<td style="text-align: left"> <a class="ulink" href="https://it.wikipedia.org/wiki/ISO_639">codice ISO 639 della lingua
(in minuscole), come "en"</a> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">YY</code> </td>
<td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/ISO_3166-3">codice ISO 3166 del paese
(in maiuscole) come "US"</a> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ZZZZ</code> </td>
<td style="text-align: left"> <a class="ulink" href="https://en.wikipedia.org/wiki/Codeset">codeset, impostato sempre ad
"UTF-8"</a> </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<div class="table">
<a id="listoflocalerecommendations"/>
<p class="title">
<strong>Tabella 1.19. Elenco di localizzazioni raccomandate</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di localizzazioni raccomandate" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> localizzazione raccomandata </th>
<th style="text-align: left"> lingua (zona) </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">en_US.UTF-8</code> </td>
<td style="text-align: left"> inglese (USA) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">en_GB.UTF-8</code> </td>
<td style="text-align: left"> inglese (Gran Bretagna) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">fr_FR.UTF-8</code> </td>
<td style="text-align: left"> francese (Francia) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">de_DE.UTF-8</code> </td>
<td style="text-align: left"> tedesco (Germania) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">it_IT.UTF-8</code> </td>
<td style="text-align: left"> italiano (Italia) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">es_ES.UTF-8</code> </td>
<td style="text-align: left"> spagnolo (Spagna) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ca_ES.UTF-8</code> </td>
<td style="text-align: left"> catalano (spagna) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">sv_SE.UTF-8</code> </td>
<td style="text-align: left"> svedese (Svezia) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">pt_BR.UTF-8</code> </td>
<td style="text-align: left"> portoghese (Brasile) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ru_RU.UTF-8</code> </td>
<td style="text-align: left"> russo (Russia) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">zh_CN.UTF-8</code> </td>
<td style="text-align: left"> cinese (Repubblica Popolare Cinese) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">zh_TW.UTF-8</code> </td>
<td style="text-align: left"> cinese (Taiwan Repubblica di Cina) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ja_JP.UTF-8</code> </td>
<td style="text-align: left"> giapponese (Giappone) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">ko_KR.UTF-8</code> </td>
<td style="text-align: left"> coreano (Corea del Sud) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">vi_VN.UTF-8</code> </td>
<td style="text-align: left"> vietnamita (Vietnam) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Una tipica esecuzione di un comando usa una sequenza sulla riga della shell
come la seguente.</p>
<pre class="screen">$ echo $LANG
en_US.UTF-8
$ date -u
Wed 19 May 2021 03:18:43 PM UTC
$ LANG=fr_FR.UTF-8 date -u
mer. 19 mai 2021 15:19:02 UTC</pre>
<p>In questo caso il programma <code class="literal">date</code>(1) viene eseguito con
differenti valori di localizzazione.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Per il primo comando "<code class="literal">$LANG</code>" è impostata al valore di
<a class="ulink" href="https://it.wikipedia.org/wiki/Localizzazione#Il_concetto_di_Locale">localizzazione</a> predefinito di sistema:
"<code class="literal">en_US.UTF-8</code>". </p>
</li>
<li class="listitem">
<p> Per il secondo comando "<code class="literal">$LANG</code>" è impostata al valore di
<a class="ulink" href="https://it.wikipedia.org/wiki/Localizzazione#Il_concetto_di_Locale">localizzazione</a> UTF-8 francese:
<code class="literal">fr_FR.UTF-8</code>". </p>
</li>
</ul>
</div>
<p>La maggior parte delle invocazioni di comandi non è solitamente preceduta da
definizioni di variabili d'ambiente. In alternativa all'esempio precedente,
si può eseguire quanto segue.</p>
<pre class="screen">$ LANG=fr_FR.UTF-8
$ date -u
mer. 19 mai 2021 15:19:24 UTC</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>Quando si segnala un bug, è una buona idea, se si usa un ambiente non
inglese, eseguire e controllare il comando nella localizzazione
"<code class="literal">en_US.UTF-8</code>".</p>
</td>
</tr>
</table>
</div>
<p>Per dettagli più specifici sulla configurazione della localizzazione vedere
<a class="xref" href="ch08.it.html#_the_locale" title="8.1. La localizzazione">Sezione 8.1, «La localizzazione»</a>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_literal_path_literal_variable"/>1.5.3. La variabile "<code class="literal">$PATH</code>"</h3>
</div>
</div>
</div>
<p>Quando si digita un comando nella shell, questa cerca il comando nelle
directory nell'elenco contenuto nella variabile d'ambiente
"<code class="literal">$PATH</code>". Il valore della variabile d'ambiente
"<code class="literal">$PATH</code>" è anche chiamato percorso di ricerca della shell.</p>
<p>In una installazione Debian standard, la variabile d'ambiente
"<code class="literal">$PATH</code>" degli account utente può non includere
"<code class="literal">/sbin</code>" e "<code class="literal">/usr/sbin</code>". Il comando
<code class="literal">ifconfig</code>, per esempio, deve essere eseguito con il
percorso completo, come in "<code class="literal">/sbin/ifconfig</code>". (Il comando
simile <code class="literal">ip</code> si trova in "<code class="literal">/bin</code>".)</p>
<p>Si può modificare la variabile d'ambiente "<code class="literal">$PATH</code>" della
shell Bash tramite il file "<code class="literal">~/.bash_profile</code>" o
"<code class="literal">~/.bashrc</code>".</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_the_literal_home_literal_variable"/>1.5.4. La variabile "<code class="literal">$HOME</code>"</h3>
</div>
</div>
</div>
<p>Molti comandi memorizzano una configurazione specifica per l'utente nella
directory home e cambiano il loro comportamento in base al suo contenuto. La
directory home è identificata dalla variabile d'ambiente
"<code class="literal">$HOME</code>".</p>
<div class="table">
<a id="listofhomevalues"/>
<p class="title">
<strong>Tabella 1.20. Elenco di valori di "<code class="literal">$HOME</code>"</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di valori di "$HOME"" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> valore di "<code class="literal">$HOME</code>" </th>
<th style="text-align: left"> situazione di esecuzione del programma </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">/</code> </td>
<td style="text-align: left"> programma eseguito da processo init (demone) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/root</code> </td>
<td style="text-align: left"> programma eseguito dalla normale shell di root </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/home/<span class="emphasis"><em>utente_normale</em></span></code> </td>
<td style="text-align: left"> programma eseguito dalla shell di un utente normale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/home/<span class="emphasis"><em>utente_normale</em></span></code> </td>
<td style="text-align: left"> programma eseguito dal menu del desktop grafico di un utente normale </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/home/<span class="emphasis"><em>utente_normale</em></span></code> </td>
<td style="text-align: left"> programma eseguito come root con "<code class="literal">sudo programma</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">/root</code> </td>
<td style="text-align: left"> programma eseguito come root con "<code class="literal">sudo -H programma</code>" </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>La shell espande "<code class="literal">~/</code> nella directory home dell'utente
attuale, cioè "<code class="literal">$HOME/</code>". La shell espande
"<code class="literal">~pippo/</code>" nella directory home di
<code class="literal">pippo</code>, cioè "<code class="literal">/home/pippo/</code>".</p>
</td>
</tr>
</table>
</div>
<p> Vedere <a class="xref" href="ch12.it.html#_shell_environment_variables" title="12.1.5. Variabile d'ambiente della shell">Sezione 12.1.5, «Variabile d'ambiente della shell»</a> se
<code class="literal">$HOME</code> non è disponibile per il proprio programma.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_command_line_options"/>1.5.5. Opzioni della riga di comando</h3>
</div>
</div>
</div>
<p>Alcuni comandi accettano argomenti. Gli argomenti che iniziano con
"<code class="literal">-</code>" o "<code class="literal">--</code>" sono chiamati opzioni e
controllano il comportamento del comando.</p>
<pre class="screen">$ date
Thu 20 May 2021 01:08:08 AM JST
$ date -R
Thu, 20 May 2021 01:08:12 +0900</pre>
<p>In questo caso l'opzione "<code class="literal">-R</code>" sulla riga di comando
cambia il comportamento di <code class="literal">date</code>(1) producendo in output
la data in una stringa conforme alla <a class="ulink" href="http://tools.ietf.org/html/rfc2822">RFC2822</a>.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_shell_glob"/>1.5.6. Glob della shell</h3>
</div>
</div>
</div>
<p>Spesso si desidera che un comando abbia effetto su un gruppo di file senza
dover digitarli tutti. I modelli di espansione dei nomi di file che usano i
<span class="strong"><strong>glob</strong></span> della shell, a volte detti <span class="strong"><strong>metacaratteri</strong></span> o <span class="strong"><strong>caratteri
jolly</strong></span>, facilitano questo compito.</p>
<div class="table">
<a id="shellglobpatterns"/>
<p class="title">
<strong>Tabella 1.21. Modelli di glob della shell</strong>
</p>
<div class="table-contents">
<table class="table" summary="Modelli di glob della shell" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> modello di glob della shell </th>
<th style="text-align: left"> descrizione della regola di corrispondenza </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">*</code> </td>
<td style="text-align: left"> nome file (segmento) che non inizia con "<code class="literal">.</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">.*</code> </td>
<td style="text-align: left"> nome file (segmento) che inizia con "<code class="literal">.</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">?</code> </td>
<td style="text-align: left"> esattamente un carattere </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">[…]</code> </td>
<td style="text-align: left"> esattamente un carattere tra quelli racchiusi tra le parentesi quadre </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">[a-z]</code> </td>
<td style="text-align: left"> esattamente un carattere che sia un carattere compreso tra
"<code class="literal">a</code>" e "<code class="literal">z</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">[^…]</code> </td>
<td style="text-align: left"> esattamente un carattere che non sia uno di quelli racchiusi tra parentesi
quadre (non contando "<code class="literal">^</code>") </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
$ echo *.txt
1.txt 2.txt
$ echo *
1.txt 2.txt 3.c 4.h
$ echo *.[hc]
3.c 4.h
$ echo .*
. .. .5.txt ..6.txt
$ echo .*[^.]*
.5.txt ..6.txt
$ echo [^1-3]*
4.h
$ cd ..; rm -rf junk</pre>
<p>Vedere <code class="literal">glob</code>(7).</p>
<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>A differenza della normale espansione dei nomi della shell, il modello shell
"<code class="literal">*</code>" cercato dal comando <code class="literal">find</code>(1) con la
ricerca "<code class="literal">-name</code>" ecc., trova corrispondenza anche con nomi
di file che iniziano con "<code class="literal">.</code>". (Nuova funzionalità <a class="ulink" href="https://it.wikipedia.org/wiki/POSIX">POSIX</a>.)</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>Si può manipolare il comportamento di BASH in relazione ai modelli di glob
usando le sue opzioni shopt incorporate come "<code class="literal">dotglob</code>",
"<code class="literal">noglob</code>", "<code class="literal">nocaseglob</code>",
"<code class="literal">nullglob</code>", "<code class="literal">extglob</code>", ecc. Vedere
<code class="literal">bash</code>(1).</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_return_value_of_the_command"/>1.5.7. Valore restituito dal comando</h3>
</div>
</div>
</div>
<p>Ogni comando restituisce il suo stato di uscita (variabile
"<code class="literal">$?</code>") come valore restituito.</p>
<div class="table">
<a id="commandexitcodes"/>
<p class="title">
<strong>Tabella 1.22. Codici di uscita dei comandi</strong>
</p>
<div class="table-contents">
<table class="table" summary="Codici di uscita dei comandi" 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"> stato di uscita del comando </th>
<th style="text-align: left"> valore numerico restituito </th>
<th style="text-align: left"> valore logico restituito </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> successo </td>
<td style="text-align: left"> zero, 0 </td>
<td style="text-align: left"> <span class="strong"><strong>VERO</strong></span> </td>
</tr>
<tr>
<td style="text-align: left"> errore </td>
<td style="text-align: left"> non-zero, -1 </td>
<td style="text-align: left"> <span class="strong"><strong>FALSO</strong></span> </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Per esempio provare quanto segue.</p>
<pre class="screen">$ [ 1 = 1 ] ; echo $?
0
$ [ 1 = 2 ] ; echo $?
1</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>Notare che, nel contesto logico della shell, il <span class="strong"><strong>successo</strong></span> è trattato come il valore logico <span class="strong"><strong>VERO</strong></span> che ha valore numerico 0 (zero). Questo è in
qualche modo non intuitivo ed è bene rimarcarlo.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_typical_command_sequences_and_shell_redirection"/>1.5.8. Sequenze tipiche di comandi e ridirezione della shell</h3>
</div>
</div>
</div>
<p>È bene cercare di ricordare i seguenti idiomi per comandi di shell che
vengono digitati sulla stessa riga come parte del comando di shell.</p>
<div class="table">
<a id="shellcommandidioms"/>
<p class="title">
<strong>Tabella 1.23. Idiomi per comandi di shell</strong>
</p>
<div class="table-contents">
<table class="table" summary="Idiomi per comandi di shell" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> idioma per comando </th>
<th style="text-align: left"> descrizione </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">comando &</code> </td>
<td style="text-align: left">esegue <code class="literal">comando</code> sullo <span class="strong"><strong>sfondo</strong></span> in una sotto-shell </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando1 | comando2</code> </td>
<td style="text-align: left">invia tramite <span class="strong"><strong>pipe</strong></span> lo standard output di
<code class="literal">comando1</code> allo standard input di
<code class="literal">comando2</code> (<span class="strong"><strong>esecuzione
concorrente</strong></span>) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando1 2>&1 | comando2</code> </td>
<td style="text-align: left">invia tramite <span class="strong"><strong>pipe</strong></span> sia lo standard output
sia lo standard error di <code class="literal">comando1</code> allo standard input di
<code class="literal">comando2</code> (<span class="strong"><strong>esecuzione</strong></span>
concorrente) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando1 ; comando2</code> </td>
<td style="text-align: left"> esegue <code class="literal">comando1</code> e <code class="literal">comando2</code> in
<span class="strong"><strong>sequenza</strong></span> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando1 && comando2</code> </td>
<td style="text-align: left"> esegue <code class="literal">comando1</code>; se ha successo, esegue
<code class="literal">comando2</code> in <span class="strong"><strong>sequenza</strong></span>
(restituisce lo stato di successo se sia <code class="literal">comando1</code>
<span class="strong"><strong>sia</strong></span> <code class="literal">comando2</code> hanno
successo) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando1 || comando2</code> </td>
<td style="text-align: left"> esegue <code class="literal">comando1</code>; se non ha successo, esegue
<code class="literal">comando2</code> in <span class="strong"><strong>sequenza</strong></span>
(restituisce lo stato di successo se <code class="literal">comando1</code> <span class="strong"><strong>o</strong></span> <code class="literal">comando2</code> ha successo) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando > pippo</code> </td>
<td style="text-align: left"> ridirige lo standard output di <code class="literal">comando</code> al file
"<code class="literal">pippo</code>" (sovrascrivendolo) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando 2> pippo</code> </td>
<td style="text-align: left"> ridirige lo standard error di <code class="literal">comando</code> al file
"<code class="literal">pippo</code>" (sovrascrivendolo) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando >> pippo</code> </td>
<td style="text-align: left"> ridirige lo standard output di <code class="literal">comando</code> al file
"<code class="literal">pippo</code>" (aggiungendo in coda) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando 2>> pippo</code> </td>
<td style="text-align: left"> ridirige lo standard error di <code class="literal">comando</code> al file
"<code class="literal">pippo</code>" (aggiungendo in coda) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando > pippo 2>&1</code> </td>
<td style="text-align: left"> ridirige sia lo standard output sia lo standard error di
<code class="literal">comando</code> al file <code class="literal">pippo</code> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando < pippo</code> </td>
<td style="text-align: left"> usa come standard input di <code class="literal">comando</code> il file
"<code class="literal">pippo</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando << delimitatore</code> </td>
<td style="text-align: left"> usa come standard input di <code class="literal">comando</code> le righe che seguono
fino a che non viene incontrato il testo "<code class="literal">delimitatore</code>"
(inserire un documento) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">comando <<- delimitatore</code> </td>
<td style="text-align: left"> usa come standard input di <code class="literal">comando</code> le righe che seguono
fino a che non viene incontrato il testo "<code class="literal">delimitatore</code>";
i caratteri di tabulazione iniziali vengono eliminate dal testo (inserire un
documento) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Il sistema Debian è un sistema multi-tasking. I compiti sullo sfondo
permettono agli utenti di eseguire più programmi in una singola shell. La
gestione dei processi sullo sfondo coinvolge i comandi interni della shell
<code class="literal">jobs</code>, <code class="literal">fg</code>, <code class="literal">bg</code> e
<code class="literal">kill</code>. Leggere le sezioni "SIGNALS" e "JOB CONTROL" di
bash(1) e <code class="literal">builtins</code>(1).</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ </etc/motd pager</pre>
<pre class="screen">$ pager </etc/motd</pre>
<pre class="screen">$ pager /etc/motd</pre>
<pre class="screen">$ cat /etc/motd | pager</pre>
<p>Benché tutti i 4 esempi di ridirezione della shell mostrino la stessa cosa,
l'ultimo esempio esegue un comando <code class="literal">cat</code> aggiuntivo e
spreca risorse senza motivo.</p>
<p>La shell permette di aprire file usando il comando interno
<code class="literal">exec</code>con un descrittore di file arbitrario.</p>
<pre class="screen">$ echo Hello >foo
$ exec 3<span class="emphasis"><em>foo 4</em></span>bar # open files
$ cat <&3 >&4 # redirect stdin to 3, stdout to 4
$ exec 3<&- 4>&- # close files
$ cat bar
Hello</pre>
<p>I descrittori di file 0-2 sono predefiniti.</p>
<div class="table">
<a id="predefinedfiledescriptors"/>
<p class="title">
<strong>Tabella 1.24. Descrittori di file predefiniti</strong>
</p>
<div class="table-contents">
<table class="table" summary="Descrittori di file predefiniti" 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"> device </th>
<th style="text-align: left"> descrizione </th>
<th style="text-align: left"> descrittore del file </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">stdin</code> </td>
<td style="text-align: left"> standard input </td>
<td style="text-align: left"> 0 </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">stdout</code> </td>
<td style="text-align: left"> standard output </td>
<td style="text-align: left"> 1 </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">stderr</code> </td>
<td style="text-align: left"> standard error </td>
<td style="text-align: left"> 2 </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_command_alias"/>1.5.9. Alias di comandi</h3>
</div>
</div>
</div>
<p>Si possono impostare alias per i comandi usati di frequente.</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ alias la='ls -la'</pre>
<p>Ora "<code class="literal">la</code>" funziona da scorciatoia per "<code class="literal">ls
-la</code>" che elenca tutti i file nel formato di elencazione esteso.</p>
<p>Si possono elencare tutti gli alias esistenti con <code class="literal">alias</code>
(vedere la sezione "SHELL BUILTIN COMMANDS" in <code class="literal">bash</code>(1)).</p>
<pre class="screen">$ alias
...
alias la='ls -la'</pre>
<p>Si può identificare il percorso esatto o l'identità di un comando con
<code class="literal">type</code> (vedere la sezione "SHELL BUILTIN COMMANDS") di
<code class="literal">bash</code>(1)).</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ type ls
ls is hashed (/bin/ls)
$ type la
la is aliased to ls -la
$ type echo
echo is a shell builtin
$ type file
file is /usr/bin/file</pre>
<p>In questo caso <code class="literal">ls</code> era stato cercato di recente mentre
"<code class="literal">file</code>" no, percio "<code class="literal">ls</code>" risulta
"hashed", cioè la shell ha un record interno per un accesso veloce alla
posizione del comando "<code class="literal">ls</code>".</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>Vedere <a class="xref" href="ch09.it.html#_colorized_commands" title="9.3.6. Comandi colorati">Sezione 9.3.6, «Comandi colorati»</a>.</p>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="_unix_like_text_processing"/>1.6. Elaborazione di testo stile Unix</h2>
</div>
</div>
</div>
<p>Nell'ambiente di lavoro Unix, l'elaborazione del testo viene fatta
instradando il testo tramite pipe attraverso catene di strumenti standard
per l'elaborazione del testo. Questa è stata un'altra fondamentale
innovazione di Unix.</p>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_unix_text_tools"/>1.6.1. Strumenti Unix per il testo</h3>
</div>
</div>
</div>
<p>Ci sono alcuni strumenti di elaborazione del testo che sono usati molto
spesso in un sistema *nix.</p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p> Senza l'uso di alcuna espressione regolare: </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><code class="literal">cat</code>(1) concatena file e produce in output il contenuto
totale. </p>
</li>
<li class="listitem">
<p><code class="literal">tac</code>(1) concatena file e produce l'output in senso
inverso. </p>
</li>
<li class="listitem">
<p><code class="literal">cut</code>(1) seleziona parti di righe e le produce in output. </p>
</li>
<li class="listitem">
<p><code class="literal">head</code>(1) produce in output la prima parte di file. </p>
</li>
<li class="listitem">
<p><code class="literal">tail</code>(1) produce in output l'ultima parte di file. </p>
</li>
<li class="listitem">
<p><code class="literal">sort</code>(1) ordina righe in file di testo. </p>
</li>
<li class="listitem">
<p><code class="literal">uniq</code>(1) rimuove righe duplicate da un file ordinato. </p>
</li>
<li class="listitem">
<p><code class="literal">tr</code>(1) trasforma o elimina caratteri. </p>
</li>
<li class="listitem">
<p><code class="literal">diff</code>(1) paragona file riga per riga. </p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p> Con espressioni regolari di base (<span class="strong"><strong>BRE</strong></span>)
viene usato in modo predefinito: </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><code class="literal">ed</code>(1) è un primitivo editor di riga. </p>
</li>
<li class="listitem">
<p><code class="literal">sed</code>(1) è un editor di flussi. </p>
</li>
<li class="listitem">
<p><code class="literal">grep</code>(1) trova corrispondenze di testo con modelli. </p>
</li>
<li class="listitem">
<p><code class="literal">vim</code>(1) è un editor a schermo. </p>
</li>
<li class="listitem">
<p><code class="literal">emacs</code>(1) è un editor a schermo (con <span class="strong"><strong>BRE</strong></span> un po' estese) </p>
</li>
</ul>
</div>
</li>
<li class="listitem">
<p> Con l'uso di espressioni regolari estese (<span class="strong"><strong>ERE</strong></span>): </p>
<div class="itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><code class="literal">awk</code>(1) fa semplici elaborazioni di testo. </p>
</li>
<li class="listitem">
<p><code class="literal">egrep</code>(1) trova corrispondenze di testo con modelli. </p>
</li>
<li class="listitem">
<p><code class="literal">tcl</code>(3tcl) può fare ogni elaborazione di testo
immaginabile: vedere <code class="literal">re_syntax</code>(3). Spesso usato con
<code class="literal">tk</code>(3tk). </p>
</li>
<li class="listitem">
<p><code class="literal">perl</code>(1) può fare ogni elaborazione di testo
immaginabile. Vedere <code class="literal">perlre</code>(1). </p>
</li>
<li class="listitem">
<p><code class="literal">pcregrep</code>(1) dal pacchetto <code class="literal">pcregrep</code>
trova corrispondenze di testo con modelli <a class="ulink" href="https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions">PCRE (Perl Compatible Regular
Expressions)</a>. </p>
</li>
<li class="listitem">
<p><code class="literal">python</code>(1) con il modulo <code class="literal">re</code> può fare
ogni elaborazione di testo immaginabile. Vedere
"<code class="literal">/usr/share/doc/python/html/index.html</code>". </p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>Se non si è sicuri di cosa facciano esattamente questi comandi, usare
"<code class="literal">man comando</code>" per scoprirlo.</p>
<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>Il criterio di ordinamento e le espressioni di intervalli dipendono dalla
localizzazione. Se si desidera ottenere il comportamento tradizionale di un
comando, usare la localizzazione <span class="strong"><strong>C</strong></span> o
<span class="strong"><strong>C.UTF-8</strong></span> invece delle normali <span class="strong"><strong>UTF-8</strong></span> (vedere <a class="xref" href="ch08.it.html#_the_locale" title="8.1. La localizzazione">Sezione 8.1, «La localizzazione»</a>).</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>Le espressioni regolari <a class="ulink" href="https://it.wikipedia.org/wiki/Perl">Perl</a>
(<code class="literal">perlre</code>(1)), le <a class="ulink" href="https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions">PCRE (Perl Compatible Regular
Expressions)</a> e le espressioni regolari <a class="ulink" href="https://it.wikipedia.org/wiki/Python">Python</a> fornite dal modulo <code class="literal">re</code> hanno
molte estensioni comuni delle normali <span class="strong"><strong>ERE</strong></span>.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_regular_expressions"/>1.6.2. Espressioni regolari</h3>
</div>
</div>
</div>
<p>Le <a class="ulink" href="https://it.wikipedia.org/wiki/Espressione_regolare">espressioni regolari</a> sono usate
in molti strumenti di elaborazione del testo. Sono analoghe ai modelli di
glob della shell, ma sono più complesse e potenti.</p>
<p>Una espressione regolare descrive il modello a cui trovare corrispondenza ed
è composta da caratteri di testo e <span class="strong"><strong>metacaratteri</strong></span>.</p>
<p>Un <span class="strong"><strong>metacarattere</strong></span> è semplicemente un
carattere con un significato speciale. Ci sono 2 stili principali, <span class="strong"><strong>BRE</strong></span> e <span class="strong"><strong>ERE</strong></span>, a
seconda degli strumenti di testo descritti in precedenza.</p>
<div class="table">
<a id="metacharactersforbreandere"/>
<p class="title">
<strong>Tabella 1.25. Metacaratteri per BRE e ERE</strong>
</p>
<div class="table-contents">
<table class="table" summary="Metacaratteri per BRE e ERE" 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"> BRE </th>
<th style="text-align: left"> ERE </th>
<th style="text-align: left"> descrizione della espressione regolare </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">\ . [ ] ^ $ *</code> </td>
<td style="text-align: left"> <code class="literal">\ . [ ] ^ $ *</code> </td>
<td style="text-align: left"> <span class="strong"><strong>metacaratteri</strong></span> comuni </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">\+ \? \( \) \{ \} \|</code> </td>
<td style="text-align: left"> </td>
<td style="text-align: left"> <span class="strong"><strong>metacaratteri</strong></span> protetti dal carattere
"<code class="literal">\</code>" di escape solo di BRE </td>
</tr>
<tr>
<td style="text-align: left"> </td>
<td style="text-align: left"> <code class="literal">+ ? ( ) { } |</code> </td>
<td style="text-align: left"> <span class="strong"><strong>metacaratteri</strong></span> non protetti dal carattere
"<code class="literal">\</code>" di escape solo di ERE </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">c</code> </td>
<td style="text-align: left"> <code class="literal">c</code> </td>
<td style="text-align: left"> corrisponde al <span class="strong"><strong>non metacarattere</strong></span>
"<code class="literal">c</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">\c</code> </td>
<td style="text-align: left"> <code class="literal">\c</code> </td>
<td style="text-align: left"> corrisponde al carattere letterale "<code class="literal">c</code>" anche se
"<code class="literal">c</code>" è in sé stesso un <span class="strong"><strong>metacarattere</strong></span> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">.</code> </td>
<td style="text-align: left"> <code class="literal">.</code> </td>
<td style="text-align: left"> corrisponde a qualsiasi carattere incluso il carattere di a capo </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">^</code> </td>
<td style="text-align: left"> <code class="literal">^</code> </td>
<td style="text-align: left"> posizione all'inizio di una stringa </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">$</code> </td>
<td style="text-align: left"> <code class="literal">$</code> </td>
<td style="text-align: left"> posizione alla fine di una stringa </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">\<</code> </td>
<td style="text-align: left"> <code class="literal">\<</code> </td>
<td style="text-align: left"> posizione all'inizio di una parola </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">\></code> </td>
<td style="text-align: left"> <code class="literal">\></code> </td>
<td style="text-align: left"> posizione alla fine di una parola </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">[abc…]</code> </td>
<td style="text-align: left"> <code class="literal">[abc…]</code> </td>
<td style="text-align: left"> corrisponde ad ogni carattere in "<code class="literal">abc...</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">[^abc…]</code> </td>
<td style="text-align: left"> <code class="literal">[^abc…]</code> </td>
<td style="text-align: left"> corrisponde ad ogni carattere eccetto a quelli in
"<code class="literal">abc...</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">r*</code> </td>
<td style="text-align: left"> <code class="literal">r*</code> </td>
<td style="text-align: left"> corrisponde a zero o più occorrenze della espressione regolare identificata
da "<code class="literal">r</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">r\+</code> </td>
<td style="text-align: left"> <code class="literal">r+</code> </td>
<td style="text-align: left"> corrisponde ad una o più occorrenza della espressione regolare identificata
da "<code class="literal">r</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">r\?</code> </td>
<td style="text-align: left"> <code class="literal">r?</code> </td>
<td style="text-align: left"> corrisponde a zero o una occorrenza dell'espressione regolare identificata
da "<code class="literal">r</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">r1\|r2</code> </td>
<td style="text-align: left"> <code class="literal">r1|r2</code> </td>
<td style="text-align: left"> corrisponde ad una occorrenza della espressione regolare identificata da
"<code class="literal">r1</code>" o "<code class="literal">r2</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">\(r1\|r2\)</code> </td>
<td style="text-align: left"> <code class="literal">(r1|r2)</code> </td>
<td style="text-align: left"> corrisponde ad una occorrenza dell'espressione regolare identificata da
"<code class="literal">r1</code>" o "<code class="literal">r2</code>" e la tratta come una
espressione regolare <span class="strong"><strong>tra parentesi</strong></span> </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Le espressioni regolari di <span class="strong"><strong><code class="literal">emacs</code></strong></span> sono fondamentalmente
<span class="strong"><strong>BRE</strong></span>, ma sono state estese per trattare
"<code class="literal">+</code>" e "<code class="literal">?</code>" come i <span class="strong"><strong>metacaratteri</strong></span> nelle <span class="strong"><strong>ERE</strong></span>. Perciò, nelle espressioni regolari di
<code class="literal">emacs</code>, non è necessario proteggerli con il carattere di
escape "<code class="literal">\</code>".</p>
<p>Per effettuare ricerche di testo usando espressioni regolari si può usare
<code class="literal">grep</code>(1).</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
Yoyodyne, Inc., hereby disclaims all copyright interest in the program</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>Vedere <a class="xref" href="ch09.it.html#_colorized_commands" title="9.3.6. Comandi colorati">Sezione 9.3.6, «Comandi colorati»</a>.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_replacement_expressions"/>1.6.3. Espressioni di sostituzione</h3>
</div>
</div>
</div>
<p>Per le espressioni di sostituzione alcuni caratteri hanno un significato
particolare.</p>
<div class="table">
<a id="thereplacementexpression"/>
<p class="title">
<strong>Tabella 1.26. L'espressione di sostituzione</strong>
</p>
<div class="table-contents">
<table class="table" summary="L'espressione di sostituzione" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> espressione di sostituzione </th>
<th style="text-align: left"> descrizione del testo che sostituirà l'espressione di sostituzione </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">&</code> </td>
<td style="text-align: left"> ciò che ha ha avuto corrispondenza con l'espressione regolare (usare
<code class="literal">\&</code> in <code class="literal">emacs</code>) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">\n</code> </td>
<td style="text-align: left"> ciò che ha avuto corrispondenza con la n-esima espressione regolare
<span class="strong"><strong>tra parentesi</strong></span> ("n" è un numero) </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Per le stringhe di sostituzione Perl viene usato «$&» invece di «&»
e «$n» invece di «\n».</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
zzz=1abc2efg3hij4=
$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=$&=/'
zzz=1abc2efg3hij4=</pre>
<p>In questo esempio si faccia particolare attenzione allo stile delle
espressioni regolari <span class="strong"><strong>tra parentesi</strong></span> e come
le stringhe corrispondenti siano usate nel processo di sostituzione del
testo dai diversi strumenti.</p>
<p>Queste espressioni regolari possono essere usate per spostare il cursore e
per fare sostituzioni di testo anche in alcuni editor.</p>
<p>La barra inversa, "<code class="literal">\</code>" alla fine della prima riga nella
riga di comando di shell protegge il carattere di a capo rendendolo uno
spazio e continuando l'input della riga di comando di shell nella riga
successiva.</p>
<p>Leggere tutte le pagine man relative per imparare l'uso di questi comandi.</p>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_global_substitution_with_regular_expressions"/>1.6.4. Sostituzione globale con espressioni regolari</h3>
</div>
</div>
</div>
<p>Il comando <code class="literal">ed</code>(1) può sostituire tutte le occorrenze di
"<code class="literal">DA_REGEX</code>" con "<code class="literal">A_TESTO</code>" in
"<code class="literal">file</code>".</p>
<pre class="screen">$ ed file <<EOF
,s/FROM_REGEX/TO_TEXT/g
w
q
EOF</pre>
<p>Il comando <code class="literal">sed</code>(1) può sostituire tutte le occorrenze di
"<code class="literal">DA_REGEX</code>" con "<code class="literal">A_TESTO</code>" in
"<code class="literal">file</code>".</p>
<pre class="screen">$ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file</pre>
<p>Il comando <code class="literal">vim</code>(1) può sostituire tutte le occorrenze di
"<code class="literal">DA_REGEX</code>" with "<code class="literal">A_TESTO</code>" in
"<code class="literal">file</code>" usando il comando <code class="literal">ex</code>(1).</p>
<pre class="screen">$ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+w' '+q' file</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>Il modificatore "<code class="literal">c</code>" nell'esempio soprastante assicura che
venga chiesta la conferma interattiva per ciascuna sostituzione.</p>
</td>
</tr>
</table>
</div>
<p>Si possono elaborare file multipli ("<code class="literal">file1</code>",
"<code class="literal">file2</code>" e "<code class="literal">file3</code>") in modo simile con
<code class="literal">vim</code>(1) o <code class="literal">perl</code>(1).</p>
<pre class="screen">$ vim '+argdo %s/FROM_REGEX/TO_TEXT/ge|update' '+q' file1 file2 file3</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>Il modificatore "<code class="literal">e</code>" nell'esempio soprastante evita che un
errore di nessuna corrispondenza trovata ("No match") rompa il processo.</p>
</td>
</tr>
</table>
</div>
<pre class="screen">$ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3</pre>
<p>Nell'esempio perl(1), "<code class="literal">-i</code>" è per la modificain-situ di
ciascun file interessato, e "<code class="literal">-p</code>" è perreiterare
implicitamente il comando su tutti i file specificati.</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>L'uso dell'opzione "<code class="literal">-i.bak</code>" invece di
"<code class="literal">-i</code>" preserva una copia del file originale aggiungendo il
suffisso "<code class="literal">.bak</code>" al suo nome file. Questo permette di
ripristinare le cose più facilmente in caso di errori in sostituzioni
complesse.</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">ed</code>(1) e <code class="literal">vim</code>(1) usano <span class="strong"><strong>BRE</strong></span>; <code class="literal">perl</code>(1) usa <span class="strong"><strong>ERE</strong></span>.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_extracting_data_from_text_file_table"/>1.6.5. Estrarre dati da file con tabelle di testo</h3>
</div>
</div>
</div>
<p>Considerare per esempio un file ti testo chiamato "<code class="literal">DPL</code>"
in cui sono elencati, in un formato separato da spazi, alcuni nomi di leader
del progetto Debian pre-2004 e la data della loro installazione.</p>
<pre class="screen">Ian Murdock August 1993
Bruce Perens April 1996
Ian Jackson January 1998
Wichert Akkerman January 1999
Ben Collins April 2001
Bdale Garbee April 2002
Martin Michlmayr March 2003</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>Vedere <a class="ulink" href="https://www.debian.org/doc/manuals/project-history/">"Una breve storia di
Debian"</a> per la <a class="ulink" href="https://www.debian.org/doc/manuals/project-history/ch-leaders">storia della
Guida del progetto Debian</a> aggiornata.</p>
</td>
</tr>
</table>
</div>
<p>Awk viene usato spesso per estrarre dati da questo tipo di file.</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ awk '{ print $3 }' <DPL # month started
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL # DPL called Ian
Ian Murdock August 1993
Ian Jackson January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
April 1996</pre>
<p>Questo tipo di file può anche essere analizzato con le shell tipo Bash.</p>
<p>Per esempio, provare a fare quanto segue.</p>
<pre class="screen">$ while read first last month year; do
echo $month
done <DPL
... same output as the first Awk example</pre>
<p>In questo caso, il comando incorporato <code class="literal">read</code> usa i
caratteri in "<code class="literal">$IFS</code>" (internal field separator, separatore
di campi interno) per suddividere le righe in parole.</p>
<p>Se si modifica "<code class="literal">$IFS</code>" in "<code class="literal">:</code>", si
possono analizzare facilmente con la shell i file
"<code class="literal">/etc/passwd</code>".</p>
<pre class="screen">$ oldIFS="$IFS" # save old value
$ IFS=':'
$ while read user password uid gid rest_of_line; do
if [ "$user" = "bozo" ]; then
echo "$user's ID is $uid"
fi
done < /etc/passwd
bozo's ID is 1000
$ IFS="$oldIFS" # restore old value</pre>
<p>(Se si usa Awk per fare la stessa cosa, usare "<code class="literal">FS=':'</code>"
per impostare il separatore di campi.)</p>
<p>IFS viene anche usato dalla shell per suddividere i risultati
dell'espansione di parametri, sostituzione di comandi ed espansioni
aritmetiche. Queste non avvengono all'interno delle virgolette singole o
doppie. Il valore predefinito di IFS è la combinazione di
<span class="emphasis"><em>spazio</em></span>, <span class="emphasis"><em>tab</em></span> e <a capo>.</p>
<p>Essere prudenti nell'uso di questi trucchetti di shell con IFS. Possono
accadere strane cose quando la shell interpreta alcune parti dello script
come suo <span class="strong"><strong>input</strong></span>.</p>
<pre class="screen">$ IFS=":," # use ":" and "," as IFS
$ echo IFS=$IFS, IFS="$IFS" # echo is a Bash builtin
IFS= , IFS=:,
$ date -R # just a command output
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R) # sub shell --> input to main shell
Sat 23 Aug 2003 08 30 36 +0200
$ unset IFS # reset IFS to the default
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200</pre>
</div>
<div class="section">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="_script_snippets_for_piping_commands"/>1.6.6. Frammenti di script per comandi con pipe</h3>
</div>
</div>
</div>
<p>Gli script seguenti fanno alcune cose carine se inseriti in una pipe.</p>
<div class="table">
<a id="listofscriptsniporpipingcommands"/>
<p class="title">
<strong>Tabella 1.27. Elenco di frammenti di script per comandi con pipe</strong>
</p>
<div class="table-contents">
<table class="table" summary="Elenco di frammenti di script per comandi con pipe" border="1">
<colgroup>
<col style="text-align: left"/>
<col style="text-align: left"/>
</colgroup>
<thead>
<tr>
<th style="text-align: left"> frammento di script (digitarlo in un'unica riga) </th>
<th style="text-align: left"> effetto del comando </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"> <code class="literal">find /usr -print</code> </td>
<td style="text-align: left"> trova tutti i file in "<code class="literal">/usr</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">seq 1 100</code> </td>
<td style="text-align: left"> stampa da 1 a 100 </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| xargs -n 1 <span class="emphasis"><em>comando</em></span></code> </td>
<td style="text-align: left"> esegue ripetutamente il comando con ogni elemento dalla pipe come argomento </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| xargs -n 1 echo</code> </td>
<td style="text-align: left"> suddivide elementi separati da spazio nella pipe su righe distinte </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| xargs echo</code> </td>
<td style="text-align: left"> unisce tutte le righe dalla pipe in una riga </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| grep -e <span class="emphasis"><em>modello_regex</em></span></code> </td>
<td style="text-align: left"> estrae dalla pipe le righe che contengono
<span class="emphasis"><em>modello_regex</em></span> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| grep -v -e <span class="emphasis"><em>modello_regex</em></span></code> </td>
<td style="text-align: left"> estrae dalla pipe le righe che non contengono
<span class="emphasis"><em>modello_regex</em></span> </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| cut -d: -f3 -</code> </td>
<td style="text-align: left"> estrae dalla il terzo campo, separato da "<code class="literal">:</code>" (file
passwd, ecc.) </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| awk '{ print $3 }'</code> </td>
<td style="text-align: left"> estrae dalla pipe il terzo campo separato da spazi </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| awk -F'\t' '{ print $3 }'</code> </td>
<td style="text-align: left"> estrae dalla pipe il terzo campo separato da tabulazioni </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| col -bx</code> </td>
<td style="text-align: left"> rimuove i caratteri backspace ed espande le tabulazioni in sequenze di spazi </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| expand -</code> </td>
<td style="text-align: left"> espande le tabulazioni </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| sort| uniq</code> </td>
<td style="text-align: left"> ordina e rimuove i duplicati </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| tr 'A-Z' 'a-z'</code> </td>
<td style="text-align: left"> converte le maiuscole in minuscole </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| tr -d '\n'</code> </td>
<td style="text-align: left"> concatena le righe in un'unica riga </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| tr -d '\r'</code> </td>
<td style="text-align: left"> rimuove i caratteri di a capo </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| sed 's/^/# /'</code> </td>
<td style="text-align: left"> aggiunge "<code class="literal">#</code>" all'inizio di ogni riga </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| sed 's/\.ext//g'</code> </td>
<td style="text-align: left"> rimuove "<code class="literal">.ext</code>" </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| sed -n -e 2p</code> </td>
<td style="text-align: left"> stampa la seconda riga </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| head -n 2 -</code> </td>
<td style="text-align: left"> stampa le prime due righe </td>
</tr>
<tr>
<td style="text-align: left"> <code class="literal">| tail -n 2 -</code> </td>
<td style="text-align: left"> stampa le ultime due righe </td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break"/>
<p>Uno script di shell di una riga può operare reiteratamente su più file
usando <code class="literal">find</code>(1) e <code class="literal">xargs</code>(1) per fare
compiti piuttosto complicati. Vedere <a class="xref" href="ch10.it.html#_idioms_for_the_selection_of_files" title="10.1.5. Esempi di invocazione per la selezione di file">Sezione 10.1.5, «Esempi di invocazione per la selezione di file»</a> e <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>
<p>Quando usare la shell in modalità interattiva diventa troppo complicato,
considerare la scrittura di uno script di shell (vedere <a class="xref" href="ch12.it.html#_the_shell_script" title="12.1. Script shell">Sezione 12.1, «Script shell»</a>).</p>
</div>
</div>
<div class="footnotes">
<br/>
<hr/>
<div id="ftn.idm2036" class="footnote">
<p><a href="#idm2036" class="para"><sup class="para">[1] </sup></a>Anche il vecchio <code class="literal">vim</code> può avviarsi nella modalità
"<code class="literal">nocompatible</code>" sensata se lo si avvia con l'opzione
"<code class="literal">-N</code>".</p>
</div>
</div>
</div>
<div class="navfooter">
<hr/>
<table width="100%" summary="Navigation footer">
<tr>
<td align="left"><a accesskey="p" href="pr01.it.html"><img src="images/prev.png" alt="Indietro"/></a> </td>
<td align="center"> </td>
<td align="right"> <a accesskey="n" href="ch02.it.html"><img src="images/next.png" alt="Avanti"/></a></td>
</tr>
<tr>
<td align="left" valign="top">Prefazione </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"> Capitolo 2. Gestione dei pacchetti in Debian</td>
</tr>
</table>
</div>
</body>
</html>