11.04.2013 Views

Guida avanzata di scripting Bash - Portale Posta DMI

Guida avanzata di scripting Bash - Portale Posta DMI

Guida avanzata di scripting Bash - Portale Posta DMI

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Appen<strong>di</strong>ce E. Una dettagliata introduzione<br />

all’I/O e alla re<strong>di</strong>rezione I/O<br />

scritta da Stéphane Chazelas e rivista dall’autore del documento<br />

Un comando si aspetta che siano <strong>di</strong>sponibili i primi tre descrittori <strong>di</strong> file. Il primo, fd 0 (lo standard input,<br />

st<strong>di</strong>n), è utilizzato per la lettura. Gli altri due (fd 1, stdout e fd 2, stderr) per la scrittura.<br />

Ad ogni comando sono associati uno st<strong>di</strong>n, uno stdout e uno stderr. ls 2>&1 trasforma<br />

temporaneamente lo stderr del comando ls in un’unica “risorsa”, lo stdout della shell.<br />

Per convenzione, un comando legge il proprio input da fd 0 (st<strong>di</strong>n), visualizza l’output in fd 1<br />

(stdout) e i messaggi d’errore in fd 2 (stderr). Se uno <strong>di</strong> questi descrittori <strong>di</strong> file non è aperto, si<br />

possono riscontrare dei problemi:<br />

bash$ cat /etc/passwd >&cat:<br />

standard output: Bad file descriptor<br />

Ad esempio, quando viene posto in esecuzione xterm, come prima cosa questo inizializza se stesso.<br />

Prima <strong>di</strong> mettere in esecuzione la shell dell’utente, xterm apre per tre volte il <strong>di</strong>spositivo <strong>di</strong> terminale<br />

(/dev/pts/ o qualcosa <strong>di</strong> analogo).<br />

A questo punto <strong>Bash</strong> ere<strong>di</strong>ta questi tre descrittori <strong>di</strong> file, a loro volta ere<strong>di</strong>tati da ogni comando (processo<br />

figlio) messo in esecuzione da <strong>Bash</strong>, tranne quando il comando viene re<strong>di</strong>retto. Re<strong>di</strong>rezione vuol <strong>di</strong>re<br />

riassegnare uno dei descrittori <strong>di</strong> file a un altro file (o ad una pipe, o ad altro che lo consenta). I<br />

descrittori <strong>di</strong> file possono essere riassegnati localmente (per un comando, un gruppo <strong>di</strong> coman<strong>di</strong>, una<br />

subshell, if o case, cicli for o while...), oppure globalmente, per l’intera shell (usando exec).<br />

ls > /dev/null esegue ls con il suo fd 1 connesso a /dev/null.<br />

bash$ lsof -a -p $$ -d0,1,2<br />

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME<br />

bash 363 bozo 0u CHR 136,1 3 /dev/pts/1<br />

bash 363 bozo 1u CHR 136,1 3 /dev/pts/1<br />

bash 363 bozo 2u CHR 136,1 3 /dev/pts/1<br />

bash$ exec 2> /dev/null<br />

bash$ lsof -a -p $$ -d0,1,2<br />

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME<br />

bash 371 bozo 0u CHR 136,1 3 /dev/pts/1<br />

777

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!