¿Cómo usar un heredoc dentro de una función bash?


12

¿Es posible insertar un heredoc dentro de una función bash?

La muestra trivial a continuación da como resultado un error: ./heredoc_in_function.sh: 10: Syntax error: end of file unexpected (expecting "}")

#!/bin/sh

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

my_function

Ambiente:

  • Ubuntu 11.04 (GNU / Linux 2.6.38-8-server x86_64)
  • GNU bash, versión 4.2.8 (1) -release (x86_64-pc-linux-gnu)

Tenía la impresión de que heredoc era una cosa de Perl. ¿Hay alguna razón para creer que funcionaría en BASH?
jdw

@jdw, aquí los documentos están presentes en muchos idiomas, incluido bash.
Zoredache

Ya veo eso ahora. Frio.
jdw

Respuestas:


10

Tu código me pareció bien, así que lo copié línea por línea y funcionó para mí en:

  • 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)

¿Es posible que vuelva a escribir el archivo a mano solo para asegurarse de que no se está perdiendo o agregando espacios / pestañas / etc.?

Además, ¿cómo lo estás ejecutando? Hice un chmod +x test.shy luego./test.sh

EDITAR: Recibí el mismo error que usted cuando agregué un espacio al comienzo de la línea con el cierre de HEREDOC.

Nota adicional: un espacio detrás del cierre HEREDOCtambién puede causar esto


1
Extraño, funciona ahora ... El resaltado de sintaxis de color de Vim reconoció el HEREDOC antes (no lo hace si agrega ese espacio antes del HEREDOC de cierre) Modifiqué el script original para usar un archivo externo, así que no estoy seguro de qué estaba mal. ¡Sin embargo, será mucho más conveniente con heredocs!
Leftium

1
¡En efecto! Me encantan algunos heredocs.
David

1
Además: un espacio final detrás del cierre HEREDOCtambién puede causar esto (este tipo de errores son realmente difíciles de rastrear. Suspiro).
0laf
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.