Cosa fa#
Stampa testo o il risultato di espansioni shell sullo standard output. È il tool principale per capire come la shell interpreta ed espande i comandi prima di eseguirli.
Sintassi#
echo [opzioni] [stringa]
Opzioni essenziali#
| Opzione | Nome | Cosa fa |
|---|---|---|
-n | no newline | Non aggiunge il carattere "a capo" (\n) alla fine. |
-e | enable escapes | Abilita l'interpretazione dei caratteri con backslash (es: \n, \t). |
-n con i PipeQuando passi dati a un altro comando tramite pipe (|), echo aggiunge automaticamente un \n alla fine. Questo può rompere script di cifratura o autenticazione.
Esempio (Base64):
# ERRATO: Include il newline (\n) nella codifica
echo "test" | base64 # Output: dGVzdAo= (il "Cg==" finale è il \n)
# CORRETTO: Codifica solo la stringa "test"
echo -n "test" | base64 # Output: dGVzdA==echo è il modo più sicuro per testare un comando distruttivo — metti echo davanti e vedi cosa farebbe senza eseguirlo davvero.
echo davanti a un comando è la versione artigianale del dry run quando il tool non ce l'ha integrato.
Espansioni supportate#
| Tipo | Esempio | Output | Note |
|---|---|---|---|
| Pathname expansion | echo *.txt | lista file .txt | * espande i nomi file corrispondenti |
| Home expansion | echo ~ | /home/barno | ~ = home directory dell'utente corrente |
| Arithmetic expansion | echo $((2+2)) | 4 | solo interi, divisione tronca |
| Brace expansion | echo {A,B,C} | A B C | genera sequenze o liste |
| Brace expansion range | echo {1..5} | 1 2 3 4 5 | range numerico o alfabetico |
| Variable expansion | echo $USER | barno | espande variabile d'ambiente |
| Command substitution | echo $(which cp) | /usr/bin/cp | esegue comando e usa l'output |
Double quotes vs Single quotes#
# Double quotes — la shell interpreta $, $(), $(())
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
# output: text ~/*.txt {a,b} foo 4 barno
# ^ ~ e {} NON espansi ^ questi sì
# Single quotes — testo letterale, niente viene interpretato
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
# output: text ~/*.txt {a,b} $(echo foo) $((2+2)) $USERRegola mentale:
" " → la shell interpreta $, $(), $(()) — tutto il resto è letterale
' ' → la shell non interpreta NIENTE — testo completamente letteraleCommand substitution — $() vs backtick#
# Moderno — preferito
ls -l $(which cp)
# Vecchio stile — evitare
ls -l `which cp`Usa sempre $() perché si annida senza problemi:
# $() annidato — leggibile
echo $(echo $(echo ciao))
# Backtick annidato — illeggibile, richiede escape
echo `echo \`echo ciao\``Combinazioni utili#
# Crea struttura directory anni/mesi in un colpo solo
mkdir {2007..2009}-{01..12}
# Verifica come la shell espande un comando prima di eseguirlo
echo rm *.txt # vedi cosa cancelleresti PRIMA di farlo davvero
# Variabili d'ambiente disponibili
printenv | lessscrivere dentro a un file#
echo '.post-cover {
max-height: 300px;
object-fit: cover;
}' > file.cssScenario Reale#
Un analista scrive uno script bash per rinominare file di log per data. Usa brace expansion per generare i nomi: mv log_{01..31}.txt /archive/. Prima di eseguire lo script in produzione, testa con echo davanti al comando per vedere esattamente cosa verrebbe eseguito senza modificare nulla.
echo vs printf#
echo → semplice, aggiunge automaticamente \n alla fine comportamento varia tra shell diverse (bash, sh, zsh)
printf → controllo totale sul formato, come il comportamento consistente su tutte le shell non aggiunge \n automaticamente
Dove l'ho usato#
- bandit-14 —
echo "password" | nc localhost 30000 - bandit-15 —
echo "password" | openssl s_client -connect localhost:30001 -quiet
Note personali#
echoè il modo più sicuro per testare un comando distruttivo — metti echo davanti e vedi cosa farebbe senza eseguirlo davvero. Single quotes = tutto letterale. Quando dubiti, usa single quotes. Abbandona i backtick — usa sempre $().
Collegato a#
- system — categoria
- standard-streams — echo scrive su stdout
- netcat — combinato con pipe per mandare dati
- openssl — combinato con pipe per mandare password
- printenv


