Punto informatico Network
Canali
20100315081905_91510602_20100315081846_1745368878_pipe_spotlight.png

Bash: pipe e redirezioni

07/05/2010
- A cura di
Linux & Open Source - Pipe e redirezioni sono tra gli strumenti fondamentali di utilizzo della shell Bash, e costituiscono parte del bagaglio di conoscenze di base che un utente della console testuale di Linux deve avere.

Tag

Passa qui con il mouse e visualizza le istruzioni per utilizzare i tag!

pipe (1) .

Valutazione

  •  
Voto complessivo 3.5 calcolato su 9 voti

Note

Nota [1]: i descrittori di file non devono essere confusi con le unità floppy (/dev/fd0, /dev/fd1...) in quanto hanno la loro directory esclusiva in /dev (dev/fd).

Nota [2]: i loro nomi sono puramente riferiti all'utilizzo: stdin è il flusso di dati in entrata in un programma dallo stdout del processo precedente nella pipeline; stdout si riferisce ai flussi di dati in uscita, stderr raggruppa i messaggi d'errore di un programma.

Nota [3]: solitamente tutti i programmi UNIX hanno un descrittore in entrata (stdin) e due descrittori in uscita (stdout e stderr).

Nota [4]: è probabile che il processo in esame abbia più di un PID (Process ID, identificatore di processo), quindi se ne può prendere in considerazione uno solo con

cd /proc/$(pidof <programma> | cut -d' ' -f1)/fd.

Nota [5]: casomai doveste subire gli effetti del garbled terminal vi basterà invocare reset da riga di comando.

Nota [6]: potete trovare un ulteriore esempio di pipe in questo articolo.

Nota [7]: l'output di gzip è un archivio gzip, quindi è sensato dargli un'estensione appropriata. Ciononostante il tipo di file non è determinato dall'estensione, ma dal suo contenuto, e potete dargli l'estensione che più vi piace, ma sappiate che programmi come browser GUI di cartelle riconoscono i tipi di file dall'estensione.

Nota [8]: la stessa cosa si sarebbe potuta fare con un'unica invocazione di basename, ovvero:

Così facendo basename filtra automaticamente l'estensione, mentre sed si limita a prendere tutte le stringhe (in gergo pattern) che corrispondono a .ko e le cancella. Questo può causare la cancellazione di pattern che non appartengono all'estensione. Tuttavia, usando solo basename non avremmo avuto il pipe che ci serviva per la dimostrazione...

Nota [9]: il simbolo di redirezione riversa l'output in un file:

  • se il file non esiste, viene creato;
  • se il file esiste, viene sovrascritto.

Il simbolo di redirezione >> (due "maggiore" in fila) riversa l'output nello stesso modo, ma se il file esiste il flusso di dati proveniente dall'ultimo programma viene accodato ai contenuti già presenti.

Nota [10]: per chiarimenti sulla struttura di $(...) fate riferimento a questo articolo.

Nota [11]: è possibile reindirizzare il contenuto di un file descriptor in un altro, usando il costrutto N>&M, dove N è il descrittore da copiare e M è il descrittore di destinazione.

Il costrutto copia il contenuto del descrittore N nel descrittore M: così facendo è possibile copiare i messaggi da stderr (descrittore 2) in stdout (descrittore 1) di un programma, salvandone anche i messaggi d'errore (che comunemente viaggiano in stderr) in un file con una redirezione:

programma 2>&1 >file.log

L'output standard e i messaggi d'errore vengono concatenati e riversati nel file file.log per una successiva consultazione. Ciò è molto utile per confrontare errori particolari o per fare debug di un programma.

In particolare, esiste una differenza tra N>&M e N&>M, ma è molto sottile ed è essenzialmente irrilevante per un utente a cui non interessino i particolari delle redirezioni.

Iscriviti gratuitamente alla newsletter, e ti segnaleremo settimanalmente tutti i nuovi contenuti pubblicati su MegaLab.it!
Pagina precedente
Appendice: "here documents"

 

Segnala ad un amico

Tuo nome Tuo indirizzo e-mail (opzionale)
Invia a:
    Aggiungi indirizzo email
    Testo

    © Copyright 2020 BlazeMedia srl - P. IVA 14742231005

    • Gen. pagina: 0.23 sec.
    •  | Utenti conn.: 29
    •  | Revisione 2.0.1
    •  | Numero query: 44
    •  | Tempo totale query: 0.05