Wie benutze ich einen Heredoc in einer Bash-Funktion?


12

Ist es möglich, einen Heredoc in eine Bash-Funktion einzufügen ?

Das folgende einfache Beispiel führt zu einem Fehler: ./heredoc_in_function.sh: 10: Syntax error: end of file unexpected (expecting "}")

#!/bin/sh

my_function () {
cat <<HEREDOC
heredoc contents
HEREDOC
}

my_function

Umgebung:

  • Ubuntu 11.04 (GNU / Linux 2.6.38-8-Server x86_64)
  • GNU Bash, Version 4.2.8 (1) -Release (x86_64-pc-linux-gnu)

Ich hatte den Eindruck, Heredoc sei eine Perl-Sache. Gibt es einen Grund zu der Annahme, dass dies in BASH funktionieren würde?
Jdw

@jdw, hier sind Dokumente in vielen Sprachen verfügbar, einschließlich Bash.
Zoredache

Das sehe ich jetzt. Cool.
Jdw

Antworten:


10

Ihr Code sah für mich gut aus, also habe ich ihn Zeile für Zeile kopiert und es hat bei mir funktioniert:

  • OSX 10.7, bash 3.2.48 (1) -Release (x86_64-apple-darwin11).
  • Ubuntu 10.04.3, bash 4.1.5 (1) -release (x86_64-pc-linux-gnu)

Ist es möglich, die Datei von Hand erneut einzugeben, um sicherzustellen, dass keine Leerzeichen / Tabulatoren / usw. fehlen?

Wie führen Sie es aus? Ich habe ein chmod +x test.shund dann./test.sh

EDIT: Ich habe den gleichen Fehler wie Sie erhalten, als ich beim Schließen von HEREDOC ein Leerzeichen am Anfang der Zeile eingefügt habe.

Weiterer Hinweis: HEREDOCDies kann auch durch ein Leerzeichen nach dem Schließen verursacht werden


1
Seltsam, es funktioniert jetzt ... Die Hervorhebung der Vim-Farbsyntax hat das HEREDOC zuvor erkannt (es ist nicht so, wenn Sie dieses Leerzeichen vor dem Schließen von HEREDOC einfügen). Ich habe das ursprüngliche Skript so geändert, dass es nur eine externe Datei verwendet war falsch. Mit heredocs wird es jedoch viel praktischer sein!
Leftium

1
Tatsächlich! Ich liebe mich einige Heredocs.
David

1
Zusätzlich: Ein Leerzeichen nach dem Schließen HEREDOCkann dies ebenfalls verursachen (Diese Art von Fehlern ist wirklich schwer zu finden.
Seufz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.