Bagaimana cara menggunakan heredoc di dalam fungsi bash?


12

Apakah mungkin memasukkan heredoc ke dalam fungsi bash?

Sampel sepele di bawah ini menghasilkan kesalahan: ./heredoc_in_function.sh: 10: Syntax error: end of file unexpected (expecting "}")

#!/bin/sh

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

my_function

Lingkungan Hidup:

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

Saya mendapat kesan bahwa heredoc adalah sesuatu yang Perl. Apakah ada alasan untuk percaya ini akan berhasil di BASH?
jdw

@ jdw, di sini ada dokumen dalam banyak bahasa termasuk bash.
Zoredache

Saya melihat itu sekarang. Keren.
jdw

Jawaban:


10

Kode Anda terlihat baik bagi saya, jadi saya menyalinnya baris demi baris dan berhasil bagi saya di:

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

Apakah mungkin bagi Anda untuk mengetik ulang file dengan tangan hanya untuk memastikan Anda tidak kehilangan atau menambahkan spasi / tabs / etc?

Juga, bagaimana Anda mengeksekusinya? Saya melakukan chmod +x test.shdan kemudian./test.sh

EDIT: Saya menerima kesalahan yang sama seperti Anda ketika saya menambahkan spasi di awal baris dengan penutupan HEREDOC.

Catatan lebih lanjut: Ruang tambahan di belakang penutupan HEREDOCjuga dapat menyebabkan ini


1
Aneh, itu berfungsi sekarang ... Penyorotan sintaks warna Vim mengenali HEREDOC sebelumnya (tidak jika Anda menambahkan spasi sebelum HEREDOC penutup) Saya memodifikasi skrip asli untuk hanya menggunakan file eksternal, jadi saya tidak yakin apa salah. Akan lebih nyaman dengan heredocs!
Leftium

1
Memang! Saya suka saya beberapa heredocs.
David

1
Selain itu: Ruang tambahan di belakang penutupan HEREDOCjuga dapat menyebabkan hal ini (Kesalahan semacam ini sangat sulit dilacak. Mendesah.)
0laf
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.