Introduzione

Durante la scrittura di script di shell si può essere in una situazione in cui è necessario passare un blocco di righe di testo o di codice a un comando interattivo, come ad esempio tee, cat o sftp.

In Bash e altre shell come Zsh, un documento Here (Heredoc) è un tipo di reindirizzamento che consente di passare più righe di input a un comando.

La sintassi della scrittura HereDoc assume la forma seguente:

[COMMAND] <<[-] 'DELIMITER'
  HERE-DOCUMENT
DELIMITER
  • La prima riga inizia con un comando facoltativo seguito dall'operatore di reindirizzamento speciale << e dall'identificatore di delimitazione.
  • È possibile utilizzare qualsiasi stringa come identificatore di delimitazione, i più comunemente utilizzati sono EOF o END.
  • Se l'identificatore di delimitazione non è quotato, la shell sostituirà tutte le variabili, i comandi e i caratteri speciali prima di passare le righe del documento qui al comando.
  • Aggiungendo un segno meno all'operatore di reindirizzamento <<-, tutti i caratteri di tabulazione principali verranno ignorati. Ciò consente di utilizzare il rientro durante la scrittura di documenti qui negli script di shell. Non sono consentiti i principali spazi bianchi, ma solo la scheda.
  • Il blocco here-document può contenere stringhe, variabili, comandi e qualsiasi altro tipo di input.
  • L'ultima riga termina con l'identificatore delimitante. Lo spazio bianco davanti al delimitatore non è consentito.

Esempi di base di Heredoc

In questa sezione, vedremo alcuni esempi di base su come usare l'ereditarietà.

Heredoc è spesso usato in combinazione con il comando cat .

Nel seguente esempio, stiamo passando due righe di testo contenenti una variabile di ambiente e un comando per cat utilizzare un documento qui.

cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

Come puoi vedere dall'output seguente, vengono sostituiti sia l'output della variabile che quello del comando:

The current working directory is: /home/noviello
You are logged in as: noviello

Vediamo cosa accadrà se racchiudiamo il delimitatore tra virgolette singole o doppie.

cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

Si può notare che quando il delimitatore viene quotato, la shell non esegue l'espansione dei parametri e la sostituzione dei comandi.

The current working directory is: $PWD
You are logged in as: $(whoami)

Se si utilizza un heredoc all'interno di un'istruzione o di un ciclo, utilizzare l'operatore di reindirizzamento <<- che consente di indentare il codice.

if true; then
    cat <<- EOF
    Line with a leading tab.
    EOF
fi
Line with a leading tab.

Invece di visualizzare l'output sullo schermo è possibile reindirizzare in un file utilizzando gli operatori >, >>.

cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

Se il file.txt non esiste verrà creato. Quando se si utilizza > il file verrà sovrascritto, mentre con l'operatore >> verrà aggiunto l'output al file.

L'ingresso Heredoc può anche essere convogliato. Nel seguente esempio il comando sed sostituirà tutte le istanze del carattere l con e:

cat <<'EOF' |  sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored

Per scrivere i dati inviati in un file:

cat <<'EOF' |  sed 's/l/e/g' > file.txt
Hello
World
EOF

Usando Heredoc con SSH

L'uso di Heredoc è uno dei modi più convenienti e semplici per eseguire più comandi su un sistema remoto tramite SSH.

Quando si utilizza il delimitatore non quotato, assicurarsi di evitare tutte le variabili, i comandi e i caratteri speciali, altrimenti verranno interpolati localmente:

ssh -T [email protected] << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
The current local working directory is: /home/noviello
The current remote working directory is: /home/user

È inoltre possibile impostare un'autenticazione basata su chiave SSH e connettersi ai server Linux senza immettere una password.

Conclusione

In questa guida, hai imparato cos'è heredoc e come usarlo negli script della shell.