Usa le pipeline Linux per coreografare il modo in cui collaborano le utilità della riga di comando. Semplifica i processi complessi e aumenta la produttività sfruttando una raccolta di comandi indipendenti e trasformandoli in un team con un unico scopo. Ti mostriamo come.
I tubi sono ovunque
Le pipeline sono una delle funzionalità della riga di comando più utili disponibili nei sistemi operativi Linux e Unix.. I tubi sono usati in innumerevoli modi. Guarda qualsiasi articolo della riga di comando di Linux, su qualsiasi portale web, non solo nel nostro, e vedrai apparire i tubi la maggior parte del tempo. Ho controllato alcuni dei post su Linux di How-To Geek, e in tutte si usano i tubi, in un modo o nell'altro.
Le pipe Linux ti consentono di eseguire azioni che non sono supportate da Linux guscio. Ma poiché la filosofia di design di Linux è di avere molte piccole utilità che facciano il tuo funzione dedicata molto benee senza funzionalità inutili, il mantra "fai una cosa e falla bene", puoi collegare stringhe di comando insieme a pipe in modo che l'output di un comando diventi l'input di un altro. Ogni comando che entra porta il loro talento unico alla squadra, e presto scoprirai di aver assemblato una squadra vincente.
Un semplice esempio
Supponiamo di avere una directory piena di molti tipi diversi di file. Vogliamo sapere quanti file di un certo tipo ci sono in quella directory. Ci sono altre alternative per farlo, ma lo scopo di questo esercizio è introdurre i tubi, per questo lo faremo con le pipe.
Possiamo ottenere un elenco dei file facilmente usando ls
:
ls
Per separare il tipo di file di interesse, noi useremo grep
. Queremos hallar archivos que tengan la palabra “pagina” nel nome o nell'estensione del file.
Useremo il carattere speciale della shell “|
“Per incanalare l'output di ls
entro grep
.
ls | grep "pagina"
grep
stampa linee che corrisponde al tuo modello di ricerca. Quindi, Questo ci dà un elenco contenente solo i file “.pagina”.
Anche questo banale esempio mostra la funzionalità delle pipe. L'uscita di ls
non è stato inviato alla finestra del terminale. È stato inviato a grep
come dati per il grep
comando di lavorare. L'output che vediamo proviene da grep,
che è l'ultimo comando in questa stringa.
Espandere la nostra catena
Iniziamo ad estendere la nostra catena di comandi pipeline. Noi possiamo contare i file “.pagina” aggiungendo il wc
comando. Useremo il -l
(conteggio delle linee) opzione con wc
. Nota che allo stesso tempo abbiamo aggiunto il -l
(formato lungo) opzione per ls
. Lo useremo a breve.
ls - | grep "pagina" | wc -l
grep
non è più l'ultimo comando della catena, quindi non vediamo la sua uscita. L'uscita di grep
si nutre di wc
comando. L'output che vediamo nella finestra del terminale è wc
. wc
informa che c'è 69 File ".page" nella directory.
Diffondiamo di nuovo le cose. Prenderemo il wc
comando fuori dalla riga di comando e sostituiscilo con awk
. Ci sono nove colonne nell'output di ls
con il -l
opzione (formato lungo). noi useremo awk
per colonne di stampa cinque, tre e nove. Queste sono le dimensioni, il proprietario e il nome del file.
ls -l | grep "pagina" | imbarazzante '{Stampa $5 " " $3 " " $9}'
Otteniamo un elenco di quelle colonne, per ciascuno dei file corrispondenti.
Ora passeremo quell'uscita attraverso il sort
comando. Useremo il -n
opzione (numerico) Lasciare sort
sappi che la prima colonna dovrebbe essere trattati come numeri.
ls -l | grep "pagina" | imbarazzante '{Stampa $5 " " $3 " " $9}' | sort -n
L'output è ora ordinato per dimensione del file, con la nostra selezione personalizzata a tre colonne.
Aggiungi un altro comando
Concludiamo aggiungendo il tail
comando. Ti diremo di elencare i ultime cinque linee di partenza soltanto.
ls -l | grep "pagina" | imbarazzante '{Stampa $5 " " $3 " " $9}' | sort -n | coda -5
Ciò significa che il nostro comando si traduce in qualcosa di simile “Mostrami i cinque file” .pagina “più grande in questa directory, ordinati per dimensione”. Da dopo, non c'è nessun comando per raggiungerlo, ma quando si usano i tubi, abbiamo creato il nostro. Potremmo aggiungere questo, o qualsiasi altro comando lungo, come alias o funzione di shell per salvare tutta la scrittura.
Ecco il risultato:
Potremmo invertire l'ordine delle taglie aggiungendo il -r
opzione (inversione) a sort
comando, e usando head
invece di tail
scegli le linee dalla parte superiore della presa.
Questa volta, i cinque file “.pagina” i più grandi sono elencati dal più alto al più basso:
Alcuni esempi recenti
Ecco due esempi interessanti dai recenti post di How-To geek.
Alcuni comandi, Come la xargs
comando, sono progettati hanno l'input canalizzato a loro. Ecco un modo che possiamo avere wc
contare le parole, caratteri e linee in più file, canalizzazione ls
entro xargs
che successivamente alimenta l'elenco dei nomi dei file a wc
come se fossero stati passati a wc
come parametri della riga di comando.
ls *.pagina | xargs wc
Il numero totale di parole, i caratteri e le linee sono elencati nella parte inferiore della finestra del terminale.
Questo è un modo per ottenere un elenco ordinato delle estensioni di file univoche nella directory corrente, con un conteggio di ogni tipo.
ls | rev | taglia -d'.' -f1 | rev | ordinare | uniq -c
Qui stanno succedendo molte cose.
L'output mostra l'elenco delle estensioni di file, in ordine alfabetico con un conteggio di ogni tipo unico.
Tubi con nome
C'è un altro tipo di tubo a nostra disposizione, chiamato pipe con nome. Le pipe negli esempi precedenti vengono create al volo attraverso la shell durante l'elaborazione della riga di comando. I tubi sono creati, usato e poi scartato. Sono passeggeri e non lasciano traccia di se stessi. Esistono solo mentre il comando che li utilizza è in esecuzione.
Le pipe con nome appaiono come oggetti persistenti nel file system, così puoi vederli usando ls
. Sono persistenti perché sopravviveranno al riavvio del computer, anche se tutti i dati non letti che contengono in quel momento verranno scartati.
Le pipe con nome sono state utilizzate molto contemporaneamente per consentire a diversi processi di inviare e ricevere dati, ma non li vedevo usati in quel modo da molto tempo. Indubbiamente, ci sono persone che li usano ancora con ottimi risultati, ma non ne ho trovati di recente. Ma per motivi di integrità, o semplicemente per soddisfare la tua curiosità, ecco come puoi usarli.
Le pipe con nome vengono create con il mkfifo
comando. Questo comando creerà una pipe con nome chiamato “geek-pipa” La virgoletta singola o l'apostrofo della parola.
mkfifo geek-pipe
Possiamo vedere i dettagli della named pipe se usiamo il ls
comando con il -l
(formato lungo) opzione:
ls -l geek-pipe
Il primo carattere dell'elenco è un “P”, il che significa che è una pipa. Se fosse un “D”, significherebbe che l'oggetto filesystem è una directory, e uno script “-” significherebbe che si tratta di un file normale.
Usa pipe con nome
Usiamo la nostra pipa. Le pipe senza nome che abbiamo usato nei nostri esempi precedenti hanno passato i dati immediatamente dal comando di invio al comando di ricezione. I dati inviati tramite una pipeline denominata rimarranno nella pipeline fino a quando non verranno letti. I dati sono veramente archiviati in memoria, quindi la dimensione della pipe denominata non varierà in ls
elencato se ci sono dati in esso o no.
Useremo due finestre di terminale per questo esempio. userò il tag:
# Terminale 1
in una finestra di terminale e
# Terminale 2
nell'altro, così puoi differenziarli. L'hashish “#” indica alla shell che ciò che segue è un commento e lo ignora.
Prendiamo l'intero nostro esempio precedente e reindirizziamolo alla pipe denominata. Quindi stiamo usando pipe con nome e senza nome in un comando:
ls | rev | taglia -d'.' -f1 | rev | ordinare | uniq -c > geek-pipa
Non sembrerà che succeda molto. Comunque, potresti notare che non torna al prompt dei comandi, quindi sta succedendo qualcosa.
Nell'altra finestra del terminale, dai questo comando:
gatto < geek-pipa
Stiamo reindirizzando il contenuto della pipe denominata a cat
, Ecco perchè cat
mostrerà quel contenuto nella seconda finestra del terminale. Ecco il risultato:
E vedrai che sei tornato al prompt dei comandi nella prima finestra del terminale.
Quindi, cos'è successo?
- Reindirizzeremo alcuni risultati alla pipe denominata.
- La prima finestra del terminale non è tornata al prompt dei comandi.
- I dati sono rimasti nella pipeline fino a quando non sono stati letti dalla pipeline al secondo terminale.
- Torniamo al prompt dei comandi nella prima finestra del terminale.
Potresti pensare di poter eseguire il comando nella prima finestra del terminale come attività in background aggiungendo a &
fino alla fine del comando. E avresti ragione. Quindi, saremmo tornati immediatamente al prompt dei comandi.
Il punto di no L'uso dell'elaborazione in background era per evidenziare che una pipe con nome è a procedura di blocco. Mettere qualcosa in una pipe con nome apre solo un'estremità della pipe. L'altra estremità non si apre finché il lettore non estrae i dati. Il kernel sospende la procedura nella prima finestra del terminale fino a quando i dati non vengono letti dall'altra estremità della pipe.
Il potere dei tubi
Attualmente, Le pipe con nome sono una specie di atto dirompente.
Le vecchie pipe di Linux, d'altra parte, sono uno degli strumenti più utili che puoi avere nel toolkit della finestra del terminale. La riga di comando di Linux inizia a prendere vita per te, E ottieni un potenziamento completamente nuovo quando puoi orchestrare una raccolta di comandi per produrre una performance coerente..
Suggerimento d'addio: è meglio scrivere i comandi in pipeline aggiungendo un comando allo stesso tempo e facendo funzionare quella parte, in seguito canalizzando nel seguente comando.
impostaTimeout(funzione(){
!funzione(F,B,e,v,n,T,S)
{Se(f.fbq)Restituzione;n=f.fbq=funzione(){n.callMethod?
n.callMethod.apply(n,argomenti):n.queue.push(argomenti)};
Se(!f._fbq)f._fbq = n;n.push=n;n.loaded=!0;n.version='2.0′;
n.coda=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(T,S) } (window, documento,'copione',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('dentro', '335401813750447');
fbq('traccia', 'Visualizzazione della pagina');
},3000);