Skip to main content
  1. Comandi/

Echo

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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
#

OpzioneNomeCosa fa
-nno newlineNon aggiunge il carattere "a capo" (\n) alla fine.
-eenable escapesAbilita l'interpretazione dei caratteri con backslash (es: \n, \t).
L'importanza di -n con i Pipe

Quando 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==
dry-run -> TESTA!

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.

dry run → "fammi vedere cosa faresti, senza farlo davvero"

Espansioni supportate
#

TipoEsempioOutputNote
Pathname expansionecho *.txtlista file .txt* espande i nomi file corrispondenti
Home expansionecho ~/home/barno~ = home directory dell'utente corrente
Arithmetic expansionecho $((2+2))4solo interi, divisione tronca
Brace expansionecho {A,B,C}A B Cgenera sequenze o liste
Brace expansion rangeecho {1..5}1 2 3 4 5range numerico o alfabetico
Variable expansionecho $USERbarnoespande variabile d'ambiente
Command substitutionecho $(which cp)/usr/bin/cpesegue 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)) $USER
Regola mentale:
" "  →  la shell interpreta $, $(), $(())  — tutto il resto è letterale
' '  →  la shell non interpreta NIENTE     — testo completamente letterale

Command 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 | less

scrivere dentro a un file
#

echo '.post-cover {
  max-height: 300px;
  object-fit: cover;
}' > file.css

Scenario 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
#

Related