cat <<EOF
syntaxe je velmi užitečná při práci s víceřádkovým textem v Bash, např. při přiřazování víceřádkového řetězce proměnné shellu, souboru nebo kanálu.
Příklady cat <<EOF
použití syntaxe v Bash:
1. Přiřaďte víceřádkový řetězec proměnné shellu
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)
$sql
proměnná nyní obsahuje i znaky nového řádku. Můžete ověřit pomocí echo -e "$sql"
.
2. Předat víceřádkový řetězec do souboru v Bash
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
print.sh
soubor nyní obsahuje:
#!/bin/bash
echo $PWD
echo /home/user
3. Předejte víceřádkový řetězec do roury v Bash
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF
b.txt
soubor obsahuje bar
a baz
linky. Stejný výstup se vytiskne na stdout
.
Říká se tomu heredoc formát pro poskytnutí řetězce do stdin. Další podrobnosti najdete na https://en.wikipedia.org/wiki/Here_document#Unix_shells.
Od man bash
:
Zde dokumenty
Tento typ přesměrování instruuje shell, aby četl vstup z aktuálního zdroje, dokud není vidět řádek obsahující pouze slovo (bez koncových mezer).
Všechny řádky přečtené do tohoto bodu jsou pak použity jako standardní vstup pro příkaz.
Formát dokumentů zde je:
<<[-]word here-document delimiter
Naslovo se neprovádí žádné rozšiřování parametrů, substituce příkazů, aritmetické rozšiřování ani rozšiřování názvu cesty . Pokud jsou ve slovu nějaké znaky jsou citovány,oddělovač je výsledkem odstranění uvozovek na word a řádky v zde-dokumentu nejsou rozbaleny.Pokud slovo je bez uvozovek, všechny řádkyzde-dokumentu jsou vystaveny expanzi parametrů, substituci příkazů a aritmetické expanzi. V druhém případě sekvence znaků
\<newline>
ignorováno a\
musí být použito k uvozování znaků\
,$
a`
.Pokud je operátor přesměrování
<<-
, pak jsou ze vstupních řádků a řádku obsahujícího oddělovač odstraněny všechny znaky tabulátoru . To umožňuje, aby byly dokumenty ve skriptech shellu odsazeny přirozeným způsobem.
Ve vašem případě je „EOF“ známý jako „Here Tag“. V podstatě <<Here
říká shellu, že se chystáte zadat víceřádkový řetězec, dokud nebude "tag" Here
. Tuto značku můžete pojmenovat, jak chcete, často je to EOF
nebo STOP
.
Některá pravidla o značkách Here:
- Značkou může být libovolný řetězec, velká nebo malá písmena, ačkoli většina lidí používá velká písmena podle konvence.
- Značka nebude považována za značku Here, pokud jsou v tomto řádku jiná slova. V tomto případě bude považována pouze za součást řetězce. Značka by měla být sama o sobě na samostatném řádku, aby byla považována za značku.
- Aby značka mohla být považována za značku, neměla by mít na začátku ani na konci mezery. Jinak bude považován za součást řetězce.
příklad:
$ 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