Pipe, Redirect e Concatenazione dei Comandi

Bentornato.
Nella lezione precedente hai scritto il tuo primo script Bash.
Ora impariamo una delle idee più potenti del terminale Linux:
Combinare comandi.
I piccoli comandi sono utili.
I comandi combinati sono potenti.
Qui il terminale smette di essere una lista di strumenti separati e diventa un laboratorio.
Un laboratorio leggermente caotico.
Ma pur sempre un laboratorio.
Cosa Imparerai
In questa lezione imparerai a:
- mandare l’output di un comando dentro un altro con le pipe;
- salvare l’output dei comandi nei file;
- aggiungere output a file esistenti;
- capire standard output e standard error;
- concatenare comandi con
&&,||e;; - usare
tee; - creare piccoli workflow.
La Missione
La tua missione è semplice:
Imparare a far lavorare insieme i comandi.
Perché un comando è utile.
Tre comandi collegati possono farti sembrare una persona che lavora segretamente alla NASA.
Con un portatile.
E sonno discutibile.
Che Cos’è una Pipe?
Una pipe manda l’output di un comando a un altro comando.
Il simbolo della pipe è:
|
Esempio:
ls | wc -l
Questo significa:
Elenca i file, poi conta le righe.
ls produce output.
wc -l conta le righe.
La pipe li collega.
Molto elegante.
Molto Linux.
Contare File in una Cartella
Prova:
ls
Ora prova:
ls | wc -l
Vedrai un numero.
Quel numero indica quante righe ha stampato ls.
Non è sempre perfetto per casi complessi, ma è utile per imparare.
Il terminale ora passa informazioni come un cameriere che porta piatti tra i comandi.
Speriamo senza farli cadere.
Cercare nell’Output di un Comando
Puoi mandare output dentro grep.
Prova:
ls | grep ".txt"
Questo mostra solo elementi che contengono .txt.
Puoi anche cercare processi:
ps aux | grep node
Questo significa:
Mostra tutti i processi, poi tieni solo le righe con
node.
È estremamente utile quando fai debug di server di sviluppo.
Specialmente quando Node.js rifiuta di andarsene come un ospite dopo mezzanotte.
Ordinare Output
Crea un piccolo file:
echo "banana" > fruits.txt
echo "apple" >> fruits.txt
echo "orange" >> fruits.txt
echo "apple" >> fruits.txt
Mostralo:
cat fruits.txt
Ora ordinalo:
cat fruits.txt | sort
Dovresti vedere le righe in ordine alfabetico.
Rimuovere Duplicati
Per rimuovere righe duplicate vicine, usa uniq.
Meglio con sort prima:
cat fruits.txt | sort | uniq
Questo significa:
Stampa il file, ordina le righe, rimuovi i duplicati.
Piccoli comandi.
Risultato potente.
Come costruire un panino, ma con testo.
Contare Valori Unici
Puoi aggiungere wc -l:
cat fruits.txt | sort | uniq | wc -l
Questo conta quanti frutti unici hai.
Il comando ora sembra più lungo.
Ma è leggibile se capisci il flusso:
cat -> sort -> uniq -> count
Questa è la magia delle pipe.
Reindirizzare Output in un File
Il simbolo > salva l’output in un file.
Prova:
echo "Hello, file!" > output.txt
Ora leggilo:
cat output.txt
Dovresti vedere:
Hello, file!
Importante: > sovrascrive il file.
Se il file aveva già contenuto, viene sostituito.
Linux non dice:
“Sei sicuro?”
Linux dice:
“Fatto.”
Freddo. Efficiente. Leggermente spaventoso.
Aggiungere Output a un File
Il simbolo >> aggiunge output alla fine.
Prova:
echo "First line" > notes.txt
echo "Second line" >> notes.txt
echo "Third line" >> notes.txt
cat notes.txt
Dovresti vedere:
First line
Second line
Third line
Usa:
>
per sostituire.
Usa:
>>
per aggiungere.
Questa differenza conta.
Molto.
Reindirizzare Errori
Ci sono due flussi comuni:
stdout = output normale
stderr = output di errore
L’output normale si reindirizza con:
>
Gli errori si reindirizzano con:
2>
Prova:
ls missing-folder 2> error.log
Ora leggi il file di errore:
cat error.log
Dovresti vedere il messaggio di errore salvato lì.
È utile quando gli script producono errori e vuoi conservarli.
Perché a volte gli errori non sono disastri.
Sono prove.
Salvare Output ed Errori Insieme
Per salvare output normale ed errori insieme:
command > output.log 2>&1
Esempio:
ls ~/terminal-practice missing-folder > result.log 2>&1
Poi:
cat result.log
Questo salva sia output corretto sia errori nello stesso file.
Molto utile per log.
Molto noioso.
Molto professionale.
Usare tee
tee permette di vedere l’output e salvarlo nello stesso momento.
Prova:
echo "Terminal power" | tee message.txt
Vedrai il testo sullo schermo e verrà anche salvato in message.txt.
Per aggiungere con tee, usa:
echo "Another line" | tee -a message.txt
tee è utile quando vuoi visibilità e log insieme.
Come dire:
“Voglio vedere cosa succede, ma voglio anche le ricevute.”
Concatenare Comandi con ;
Il simbolo ; esegue comandi uno dopo l’altro.
echo "One"; echo "Two"; echo "Three"
Anche se un comando fallisce, il successivo viene comunque eseguito.
Esempio:
mkdir demo; cd demo; pwd
Questa è concatenazione semplice.
Utile.
Ma non sempre sicura.
Concatenare Comandi con &&
Il simbolo && esegue il comando successivo solo se quello precedente ha successo.
Esempio:
mkdir safe-demo && cd safe-demo && pwd
Significa:
Crea la cartella. Se funziona, entraci. Se funziona, mostra la posizione.
È più sicuro di ;.
Se qualcosa fallisce, la catena si ferma.
Molto utile per script e setup.
Meno drama.
Più controllo.
Concatenare Comandi con ||
Il simbolo || esegue il comando successivo solo se quello precedente fallisce.
Esempio:
mkdir safe-demo || echo "Folder already exists or could not be created."
Altro esempio:
ping -c 1 example.com || echo "Network problem."
È utile per messaggi di fallback.
Il terminale dice:
“Se questo fallisce, fai quello.”
Molto pratico.
Molto adulto.
Combinare Tutto
Ecco un piccolo workflow:
ps aux | grep node > node-processes.txt
cat node-processes.txt
Trova processi Node.js e li salva in un file.
Altro esempio:
ls -la | tee files.log | grep ".txt"
Significa:
Elenca file con dettagli, salva tutto in
files.loge mostra solo righe.txt.
Ora stiamo cucinando.
Cucina da terminale.
Niente padella.
Solo pipe.
Errori Comuni
Sovrascrivere un file per sbaglio
Questo sovrascrive:
echo "new text" > notes.txt
Questo aggiunge:
echo "new text" >> notes.txt
Prima di usare >, pensa.
I tuoi file meritano almeno un secondo di rispetto.
Dimenticare che le pipe passano output, non file
Questo funziona:
cat fruits.txt | sort
Ma molti comandi possono leggere file direttamente:
sort fruits.txt
Le pipe sono potenti, ma non usarle solo per sembrare cool.
Il terminale sa quando stai fingendo.
grep che trova sé stesso
Quando esegui:
ps aux | grep node
potresti vedere anche il comando grep node.
È normale.
Puoi evitarlo con:
ps aux | grep "[n]ode"
Un piccolo trucco.
Gli utenti Linux amano i piccoli trucchi.
A volte troppo.
Pratica
Prova:
cd ~/terminal-practice
echo "banana" > fruits.txt
echo "apple" >> fruits.txt
echo "orange" >> fruits.txt
echo "apple" >> fruits.txt
cat fruits.txt
cat fruits.txt | sort
cat fruits.txt | sort | uniq
cat fruits.txt | sort | uniq | wc -l
echo "Saved output" > saved.txt
echo "Appended output" >> saved.txt
cat saved.txt
ls missing-folder 2> error.log
cat error.log
Poi rispondi:
- Cosa fa
|? - Cosa fa
>? - Cosa fa
>>? - Cosa fa
2>? - Cosa fa
&&? - Cosa fa
||?
Mini Sfida
Crea un file animals.txt con queste righe:
cat
dog
bird
cat
dog
elephant
Poi usa i comandi per:
- Ordinare il file.
- Rimuovere duplicati.
- Contare animali unici.
- Salvare la lista ordinata e unica in
unique-animals.txt. - Mostrare il risultato sullo schermo e salvarlo nello stesso momento con
tee.
Niente mouse.
Il mouse ha completato il corso come osservatore.
Riassunto
Oggi hai imparato che:
- le pipe mandano output da un comando a un altro;
>salva output e sovrascrive file;>>aggiunge output;2>reindirizza errori;2>&1combina output normale ed errori;teemostra output e lo salva;;esegue comandi uno dopo l’altro;&&esegue il comando successivo solo se il precedente ha successo;||esegue il comando successivo solo se il precedente fallisce;- piccoli comandi possono diventare workflow potenti quando combinati.
Questa è una delle idee più profonde del terminale Linux.
Fare una cosa bene.
Poi collegare quelle cose.
Questa è la filosofia Unix in azione.
Corso Completato
Congratulazioni.
Hai completato il Corso sul Terminale Linux.
Sei partito dalla misteriosa finestra nera.
Ora sai:
- muoverti nel file system;
- gestire file e cartelle;
- leggere e cercare file;
- capire i permessi;
- installare software;
- monitorare processi;
- controllare la rete;
- lavorare con archivi;
- usare variabili e alias;
- scrivere script Bash;
- combinare comandi in workflow.
Il terminale non è più un mostro.
È uno strumento.
Uno strumento affilato.
Uno strumento potente.
Uno strumento che merita ancora rispetto.
Ora pratica.
Con calma.
E magari fai un backup prima.