androide

Bash heredoc

What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179

What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179

Sommario:

Anonim

Durante la scrittura di 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 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:

<< 'DELIMITER' HERE-DOCUMENT DELIMITER

  • La prima riga inizia con un comando facoltativo seguito dallo speciale operatore di reindirizzamento << 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. segno meno per l'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 qui-documento 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 d'ambiente e un comando per cat usando 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/linuxize You are logged in as: linuxize

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)

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 reindirizzarlo a 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 si utilizza > il file verrà sovrascritto, mentre >> aggiungerà l'output al file.

L'ingresso heredoc può anche essere convogliato. Nell'esempio seguente 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/linuxize 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.

bash terminal