
Při psaní shell skriptů se můžete dostat do situace, kdy potřebujete předat víceřádkový blok textu nebo kódu interaktivnímu příkazu, jako je tee
, cat
nebo sftp
.
V Bash a dalších shellech, jako je Zsh, je dokument Here (Heredoc) typem přesměrování, který vám umožňuje předat příkazu více řádků vstupu.
Syntaxe psaní HereDoc má následující podobu:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- První řádek začíná volitelným příkazem, za nímž následuje speciální operátor přesměrování
<<
a oddělovací identifikátor.- Jako oddělovací identifikátor můžete použít libovolný řetězec, nejčastěji používané jsou EOF nebo END.
- Pokud oddělovací identifikátor není v uvozovkách, shell nahradí všechny proměnné, příkazy a speciální znaky před předáním řádků dokumentu zde příkazu.
- Přidání znaménka mínus k operátoru přesměrování
<<-
, způsobí, že všechny úvodní znaky tabulátoru budou ignorovány. To vám umožňuje používat odsazení při psaní dokumentů zde ve skriptech shellu. Úvodní mezery nejsou povoleny, pouze tabulátor.
- Blok dokumentu zde může obsahovat řetězce, proměnné, příkazy a jakýkoli jiný typ vstupu.
- Poslední řádek končí oddělovacím identifikátorem. Bílé místo před oddělovačem není povoleno.
Základní příklady Heredoc #
V této části se podíváme na některé základní příklady použití heredoc.
Heredoc se nejčastěji používá v kombinaci s příkazem cat.
V následujícím příkladu předáváme dva řádky textu obsahující proměnnou prostředí a příkaz cat
pomocí dokumentu zde.
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Jak můžete vidět z výstupu níže, proměnná i výstup příkazu jsou nahrazeny:
The current working directory is: /home/linuxize
You are logged in as: linuxize
Podívejme se, co se stane, když oddělovač uzavřeme do jednoduchých nebo dvojitých uvozovek.
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Můžete si všimnout, že když je uvozován oddělovač, shell neprovádí žádné rozšiřování parametrů a nahrazování příkazů.
The current working directory is: $PWD
You are logged in as: $(whoami)
Pokud používáte heredoc uvnitř příkazu nebo smyčky, použijte <<-
operace přesměrování, která vám umožní odsadit váš kód.
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
Line with a leading tab.
Místo zobrazení výstupu na obrazovce jej můžete přesměrovat do souboru pomocí >
, >>
operátory.
cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Pokud soubor.txt neexistuje, bude vytvořen. Při použití >
soubor bude přepsán, zatímco >>
připojí výstup k souboru.
Vstup heredoc lze také převést potrubím. V následujícím příkladu sed
příkaz nahradí všechny výskyty l
znak s e
:
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
Chcete-li zapsat přenesená data do souboru:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
Použití Heredocu s SSH #
Použití Heredoc je jedním z nejpohodlnějších a nejjednodušších způsobů, jak provádět více příkazů na vzdáleném systému přes SSH.
Při použití oddělovače bez uvozovek se ujistěte, že jste escapovali všechny proměnné, příkazy a speciální znaky, jinak budou interpolovány lokálně:
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
Můžete také chtít nastavit ověřování na základě klíče SSH a připojit se k serverům Linux bez zadávání hesla.
Závěr č.
V této příručce jste se naučili, co je heredoc
a jak jej používat ve skriptech shellu.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.