Il cat <<EOF
la sintassi è molto utile quando si lavora con testo su più righe in Bash, ad es. quando si assegna una stringa multilinea a una variabile di shell, file o pipe.
Esempi di cat <<EOF
utilizzo della sintassi in Bash:
1. Assegna una stringa multilinea a una variabile di shell
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)
Il $sql
variabile ora contiene anche i caratteri di nuova riga. Puoi verificare con echo -e "$sql"
.
2. Passa una stringa multilinea a un file in Bash
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
Il print.sh
il file ora contiene:
#!/bin/bash
echo $PWD
echo /home/user
3. Passa una stringa multilinea a una pipe in Bash
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF
Il b.txt
il file contiene bar
e baz
linee. Lo stesso output viene stampato su stdout
.
Questo si chiama heredoc format per fornire una stringa in stdin. Vedi https://en.wikipedia.org/wiki/Here_document#Unix_shells per maggiori dettagli.
Da man bash
:
Qui Documenti
Questo tipo di reindirizzamento istruisce la shell a leggere l'input dalla sorgente corrente finché non viene vista una riga contenente solo parole (senza spazi vuoti).
Tutte le righe lette fino a quel punto vengono quindi utilizzate come input standard per un comando.
Il formato degli here-documents è:
<<[-]word here-document delimiter
Nessuna espansione di parametro, sostituzione di comando, espansione aritmetica o espansione di percorso viene eseguita suparola . Se ci sono caratteri in word sono tra virgolette, il delimitatore è il risultato della rimozione delle virgolette su parola e le righe nel here-document non sono espansi.Se parola non è quotato, tutte le righe del qui-documento sono soggetti all'espansione dei parametri, alla sostituzione dei comandi e all'espansione aritmetica. In quest'ultimo caso, la sequenza di caratteri
\<newline>
isignored e\
deve essere utilizzato per citare i caratteri\
,$
e`
.Se l'operatore di reindirizzamento è
<<-
, quindi tutti i caratteri di tabulazione iniziali vengono rimossi dalle righe di input e dalla riga contenente il delimitatore . Ciò consente ai documenti here all'interno degli script di shell di essere indentati in modo naturale.
Nel tuo caso, "EOF" è noto come "Here Tag". Fondamentalmente <<Here
dice alla shell che stai per inserire una stringa multilinea fino al "tag" Here
. Puoi nominare questo tag come preferisci, spesso è EOF
o STOP
.
Alcune regole sui tag Here:
- Il tag può essere qualsiasi stringa, maiuscolo o minuscolo, anche se la maggior parte delle persone usa il maiuscolo per convenzione.
- Il tag non verrà considerato come un tag Here se ci sono altre parole in quella riga. In questo caso, sarà semplicemente considerato parte della stringa. Il tag dovrebbe essere da solo su una riga separata, per essere considerato un tag.
- Il tag non deve avere spazi iniziali o finali in quella riga per essere considerato un tag. Altrimenti sarà considerato come parte della stringa.
esempio:
$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
> HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string