Skip to main content
  1. Concetti/

Heredoc - blocco di testo come stdin

·3 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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
SENTINELLA

Tutto 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
EOF

La 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
EOF

Qui 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
EOF

Creare file da script bash
#

cat > /tmp/config.yaml <<EOF
host: 192.168.64.3
port: 9200
user: admin
EOF

Parameter 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
SintassiComportamento
${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
EOF

Collegato 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

Related