Potresti aver usato una sintassi come cmd0 | cmd1 | cmd2
nel tuo terminale troppe volte.
Probabilmente sai anche che è il reindirizzamento della pipe che viene utilizzato per reindirizzare l'output di un comando come input per il comando successivo.
Ma sai cosa c'è sotto? Come funziona effettivamente il reindirizzamento delle pipe?
Non preoccuparti perché oggi demistificarò le pipe Unix in modo che la prossima volta che andrai ad un appuntamento con quelle fantasiose barre verticali, saprai esattamente cosa sta succedendo.
Nota:ho usato il termine Unix in alcuni punti perché il concetto di pipe (come tante altre cose in Linux) ha origine da Unix.
Pipe in Linux:l'idea generale
Ecco cosa vedrai ovunque riguardo a "cosa sono le pipe Unix?":
- Le pipe Unix sono un meccanismo IPC (Inter Process Communication), che inoltra l'output di un programma all'input di un altro programma.
Ora, questa è la spiegazione generale che danno tutti. Voglio andare più a fondo. Riformuliamo la riga precedente in modo più tecnico togliendo le astrazioni:
- Le pipe Unix sono un meccanismo IPC (Inter Process Communication) che accetta lo
stdout
di un programma e lo inoltra astdin
di un altro programma tramite un buffer.
Molto meglio. Togliere l'astrazione l'ha resa molto più pulita e precisa. Puoi guardare il diagramma seguente per capire come funziona il tubo:

Uno degli esempi più semplici del comando pipe è passare alcuni output di comando al comando grep per cercare una stringa specifica.
Ad esempio, puoi cercare file il cui nome contiene txt come questo:

Ricorda:Pipe reindirizza stdout a stdin ma non come argomento di comando
Una cosa molto importante da capire è che pipe trasferisce lo stdout
di un comando a stdin
di un altro ma non come argomento di comando. Te lo spiego con un esempio.
Se usi cat
comando senza argomenti, per impostazione predefinita leggerà da stdin
. Ecco un esempio:
$ cat
Subscribe to Linux Handbook for more articles like this
^D
Subscribe to Linux Handbook for more articles like this
Qui ho usato cat
senza passare alcun file, quindi il valore predefinito è stdin
. Successivamente ho scritto una riga e quindi ho usato Ctrl+d per fargli sapere che ho finito di scrivere (Ctrl+d implica EOF o End Of File). Una volta che ho finito di scrivere, cat leggere da stdin
, e ha scritto proprio quella riga a stdout
.
Consideriamo ora il seguente comando:
echo hey | cat
Il secondo comando NON è equivalente a cat hey
. Qui, lo stdout
, "hey", viene portato in un buffer e trasferito a stdin
di cat
. Poiché non c'erano argomenti della riga di comando, cat ha impostato per impostazione predefinita stdin
per la lettura, e c'era già qualcosa nello stdin, quindi il comando cat lo ha preso e stampato su stdout
.
In effetti, ho creato un file chiamato hey e ci ho inserito del contenuto. Puoi vedere chiaramente la differenza nell'immagine qui sotto:

Tipi di pipe in Linux
Esistono due tipi di pipe in Linux:
- Pipe senza nome, dette anche pipe anonime
- Pipe denominate
Leggi la storia completa
Il resto dell'articolo è disponibile solo per i membri LHB. Puoi iscriverti ora GRATUITAMENTE per leggere il resto di questo articolo insieme all'accesso a tutti i post riservati ai membri. Ti iscrivi anche alla nostra newsletter quindicinale Linux.
IscrivitiHai già un account?Accedi