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.