← Back to course

Pipe, Redirect e Concatenazione dei Comandi

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:

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.log e 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:

  1. Cosa fa |?
  2. Cosa fa >?
  3. Cosa fa >>?
  4. Cosa fa 2>?
  5. Cosa fa &&?
  6. Cosa fa ||?

Mini Sfida

Crea un file animals.txt con queste righe:

cat
dog
bird
cat
dog
elephant

Poi usa i comandi per:

  1. Ordinare il file.
  2. Rimuovere duplicati.
  3. Contare animali unici.
  4. Salvare la lista ordinata e unica in unique-animals.txt.
  5. 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:

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:

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.