Как использовать heredoc внутри функции bash?

12

Возможно ли вставить heredoc в функцию bash?

Тривиальный пример ниже приводит к ошибке: ./heredoc_in_function.sh: 10: Syntax error: end of file unexpected (expecting "}")

#!/bin/sh

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

my_function

Окружающая обстановка:

  • Ubuntu 11.04 (GNU / Linux 2.6.38-8-server x86_64)
  • GNU bash, версия 4.2.8 (1) -релиз (x86_64-pc-linux-gnu)
Leftium
источник
У меня сложилось впечатление, что heredoc - вещь Perl. Есть ли основания полагать, что это сработает в BASH?
JDW
@jdw, здесь документы представлены на многих языках, включая bash.
Зоредаче
Я вижу это сейчас. Здорово.
JDW

Ответы:

10

Ваш код выглядел хорошо для меня, поэтому я скопировал его строка за строкой, и он работал для меня:

  • OSX 10.7, bash 3.2.48 (1) -релиз (x86_64-apple-darwin11).
  • Ubuntu 10.04.3, bash 4.1.5 (1) -релиз (x86_64-pc-linux-gnu)

Можете ли вы перепечатать файл вручную, чтобы убедиться, что вы не пропустили или добавили пробелы / табуляции / и т. Д.?

Кроме того, как ты это делаешь? Я сделал chmod +x test.shа потом./test.sh

РЕДАКТИРОВАТЬ: я получил ту же ошибку, что и вы, когда я добавил пробел в начале строки с закрывающим HEREDOC.

Дальнейшее примечание: завершающий пробел за закрытием HEREDOCтакже может вызвать это

Дэвид
источник
1
Странно, теперь это работает ... Подсветка синтаксиса Vim распознала HEREDOC раньше (этого не происходит, если вы добавляете это пространство перед закрытием HEREDOC). Я изменил исходный скрипт, чтобы использовать только внешний файл, поэтому я не уверен, что был неправ. Хотя с heredocs это будет намного удобнее!
Leftium
1
В самом деле! Я люблю меня некоторые heredocs.
Дэвид
1
Дополнительно: это HEREDOCможет привести к
пробелу в