Cosa fa#
Permette di passare un blocco di testo multiriga come stdin a un comando, senza file temporanei. Il testo viene delimitato da una parola sentinella (di solito EOF).
TL;DR#
comando <<SENTINELLA
riga 1
riga 2
riga 3
SENTINELLATutto il testo tra le due sentinelle viene passato come stdin al comando — come se lo avessi scritto in un file e poi fatto cat file | comando.
Sintassi#
comando <<EOF
contenuto
multiriga
EOFLa parola sentinella e' arbitraria — EOF e' convenzione, ma funziona anche FINE, END, CONF. L'unica regola: la riga di chiusura deve contenere solo la sentinella, senza spazi prima.
Varianti#
Heredoc con espansione variabili (default)#
nome="barno"
cat <<EOF
Ciao $nome
Oggi e' $(date)
EOF
# Output: Ciao barno / Oggi e' dom 26 apr 2026...Le variabili $var e le subshell $() vengono espanse.
Heredoc senza espansione (sentinella quoted)#
cat <<'EOF'
Ciao $nome
Questo e' un dollaro: $
EOF
# Output: Ciao $nome / Questo e' un dollaro: $Con la sentinella tra apici singoli 'EOF' — nessuna espansione, il testo e' letterale.
Pattern piu' comuni#
Scrivere file di configurazione come root#
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOFQui la subshell $(. /etc/os-release && ...) viene espansa prima che il testo venga passato a tee.
Passare input a uno script interattivo#
ssh utente@server <<EOF
cd /var/log
ls -lh auth.log
tail -20 auth.log
EOFCreare file da script bash#
cat > /tmp/config.yaml <<EOF
host: 192.168.64.3
port: 9200
user: admin
EOFParameter expansion — ${VAR:-fallback}#
Dentro un heredoc (senza apici) le variabili vengono espanse. La sintassi ${VAR:-fallback} e' utile per gestire variabili che potrebbero non esistere:
${UBUNTU_CODENAME:-$VERSION_CODENAME}
# Se UBUNTU_CODENAME esiste e non e' vuota → usa quella
# Altrimenti → usa VERSION_CODENAME come fallback| Sintassi | Comportamento |
|---|---|
${VAR} | Valore di VAR, errore se non esiste |
${VAR:-default} | Valore di VAR, oppure default se vuota/non esiste |
${VAR:=default} | Come sopra, ma assegna anche il default a VAR |
${VAR:?messaggio} | Errore con messaggio se VAR e' vuota/non esiste |
Scenario Reale#
Installazione Docker su Ubuntu: il repo richiede di creare /etc/apt/sources.list.d/docker.sources con contenuto specifico che include il nome in codice della distro. Con heredoc + sudo tee si scrive tutto in un comando, con espansione automatica della variabile OS.
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOFCollegato a#
- tee — il comando piu' usato con heredoc per file protetti
- standard-streams — heredoc genera stdin
- shell-environment — variabili e subshell usate dentro heredoc
- system — categoria



