Quanto segue è leggermente semplificato per aiutare i nuovi utenti.
Bene, in primo luogo, è necessario comprendere il concetto di input standard e output standard.
In Linux e altri sistemi operativi simili a UNIX, ogni processo ha un input standard ( stdin
) e un output standard ( stdout
). La solita situazione è quella stdin
della tastiera e stdout
dello schermo o della finestra del terminale.
Quindi, quando corri ls
, genererà il suo output stdout
. Se non fai nient'altro, andrà allo schermo o alla finestra del terminale e lo visualizzerai.
Ora, alcuni comandi di Linux interagiscono con l'utente e lo usano stdin
, il tuo editor di testo è uno di quelli. Legge da stdin
accettare i tasti premuti, fare cose e quindi scrivere cose su stdout
.
Tuttavia, ci sono anche comandi non interattivi o "filtro" che NON funzionano in modo interattivo, ma vogliono un sacco di dati. Questi comandi prenderanno tutto ciò che stdin
ha, faranno qualcosa e poi lo lancerannostdout
Diamo un'occhiata a un altro comando chiamato du
- indica l'utilizzo del disco. du /usr
, ad esempio, stamperà (per stdout
apprezzare qualsiasi altro comando Linux) un elenco di ogni file in quella directory e le sue dimensioni:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
Come si può capire subito, non è ordinato e probabilmente lo si desidera in ordine di grandezza.
sort
è uno di quei comandi "filtro" che prenderanno un sacco di cose stdin
e le ordineranno.
Quindi, se lo facciamo:
# du /usr | sort -nr
otteniamo questo, che è un po 'meglio:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
E ora puoi vedere che la "pipe" collega il stdout
comando di un comando a quello stdin
di un altro. In genere lo utilizzerai in situazioni come questa in cui desideri filtrare, ordinare o altrimenti manipolare l'output di un comando. Possono essere collegati in cascata se si desidera elaborare l'output tramite più comandi di tipo filtro.
Se digiti sort
da solo, proverà comunque a leggere stdin
. Poiché stdin
è collegato alla tua tastiera, ti aspetterà di digitare e di elaborare le cose fino a quando non premi Control-D. Non ti chiederà perché non è davvero pensato per essere usato in modo interattivo.
È possibile che un programma indichi se stdin
è interattivo o meno, quindi alcuni programmi potrebbero agire in modo diverso se vengono emessi da soli o alla fine di una pipe.
Inoltre, il piping di un programma che funziona solo in modo interattivo, come vi
, ti farà passare dei brutti momenti.
I tubi sono diversi dal reindirizzamento in quanto i dati vengono mescolati da un comando all'altro senza essere memorizzati in alcun luogo. Quindi, nell'esempio sopra, du
l'output non è memorizzato da nessuna parte. La maggior parte delle volte non lo vuoi con le pipe perché il motivo per usare le pipe è quello di elaborare l'output di un comando in qualche modo - ma, c'è un comando tee
che ti consente di avere la tua torta e mangiarla anche, lo farà copia ciò che riceve da stdin
entrambi stdout
e un file di tua scelta. Probabilmente puoi farlo anche bash
con una sintassi arcana che coinvolge e commerciali e parentesi che non conosco.
|
è che non usa un nome, l'output del comando l-hand viene passato direttamente all'input per il comando sul lato r della pipe.