Comment utiliser un hérédoc dans une fonction bash?


12

Est-il possible d'insérer un heredoc dans une fonction bash?

L'exemple trivial ci-dessous entraîne une erreur: ./heredoc_in_function.sh: 10: Syntax error: end of file unexpected (expecting "}")

#!/bin/sh

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

my_function

Environnement:

  • Ubuntu 11.04 (GNU / Linux 2.6.38-8-serveur x86_64)
  • GNU bash, version 4.2.8 (1) -release (x86_64-pc-linux-gnu)

J'avais l'impression que heredoc était une chose Perl. Y a-t-il une raison de croire que cela fonctionnerait dans BASH?
2011

@jdw, ici les documents sont présents dans de nombreuses langues, y compris bash.
Zoredache

Je vois ça maintenant. Cool.
jdw

Réponses:


10

Votre code me paraissait bien, alors je l'ai copié ligne par ligne et cela a fonctionné pour moi:

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

Est-il possible pour vous de retaper le fichier à la main juste pour vous assurer de ne pas manquer ou d'ajouter des espaces / tabulations / etc?

Aussi, comment l'exécutez-vous? J'ai fait un chmod +x test.shet puis./test.sh

EDIT: J'ai reçu la même erreur que vous lorsque j'ai ajouté un espace au début de la ligne avec le HEREDOC de fermeture.

Remarque supplémentaire: un espace de fuite derrière la fermeture HEREDOCpeut également provoquer cette


1
Bizarre, ça marche maintenant ... La coloration syntaxique des couleurs Vim a reconnu le HEREDOC avant (ce n'est pas le cas si vous ajoutez cet espace avant le HEREDOC de fermeture) J'ai modifié le script original pour utiliser simplement un fichier externe, donc je ne suis pas sûr de ce que avait tort. Ce sera beaucoup plus pratique avec heredocs, cependant!
Leftium

1
En effet! Je m'aime quelques heredocs.
David

1
De plus: un espace de fuite derrière la fermeture HEREDOCpeut également provoquer cela (ce type d'erreurs est vraiment difficile à
localiser
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.