Quando scrivi script di shell potresti trovarti in una situazione in cui devi passare un blocco di testo o codice multilinea a un comando interattivo, come tee
, cat
o sftp
.
In Bash e in altre shell come Zsh, un documento Here (Heredoc) è un tipo di reindirizzamento che ti consente di passare più righe di input a un comando.
La sintassi per scrivere HereDoc assume la forma seguente:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- La prima riga inizia con un comando opzionale seguito dall'operatore di reindirizzamento speciale
<<
e l'identificatore di delimitazione.- Puoi utilizzare qualsiasi stringa come identificatore di delimitazione, i più comunemente usati sono EOF o END.
- Se l'identificatore di delimitazione non è tra virgolette, la shell sostituirà tutte le variabili, i comandi ei caratteri speciali prima di passare le righe here-document al comando.
- Aggiungere un segno meno all'operatore di reindirizzamento
<<-
, tutti i caratteri di tabulazione iniziali verranno ignorati. Questo ti permette di usare l'indentazione quando scrivi qui-documenti negli script della shell. Non sono consentiti spazi iniziali iniziali, solo tabulazione.
- Il blocco here-document può contenere stringhe, variabili, comandi e qualsiasi altro tipo di input.
- L'ultima riga termina con l'identificatore di delimitazione. Lo spazio bianco davanti al delimitatore non è consentito.
Esempi di base di Heredoc #
In questa sezione, esamineremo alcuni esempi di base di come utilizzare heredoc.
Heredoc è spesso usato in combinazione con il comando cat.
Nell'esempio seguente, stiamo passando due righe di testo contenenti una variabile di ambiente e un comando a cat
utilizzando un documento qui.
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Come puoi vedere dall'output di seguito, vengono sostituiti sia l'output della variabile che quello del comando:
The current working directory is: /home/linuxize
You are logged in as: linuxize
Vediamo cosa succede se racchiudiamo il delimitatore tra virgolette singole o doppie.
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Puoi notare che quando il delimitatore è 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 stai usando un heredoc all'interno di un'istruzione o di un ciclo, usa il <<-
operazione di reindirizzamento che ti permette di indentare il tuo 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, puoi reindirizzarlo a un file utilizzando il >
, >>
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 si utilizza >
il file verrà sovrascritto, mentre il >>
aggiungerà l'output al file.
L'input heredoc può anche essere reindirizzato. Nell'esempio seguente il sed
il comando sostituirà tutte le istanze di l
carattere con e
:
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
Per scrivere i dati convogliati in un file:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
Utilizzo di 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 usi un delimitatore senza virgolette assicurati di sfuggire a 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/linuxize
The current remote working directory is: /home/user
Potresti anche voler configurare un'autenticazione basata su chiave SSH e connetterti ai tuoi server Linux senza inserire una password.
Conclusione #
In questa guida hai imparato cos'è heredoc
e come usarlo negli script della shell.
Se hai domande o feedback, sentiti libero di lasciare un commento.