Bagaimana cara membuat "dokumen di sini" di dalam fungsi shell?

2

Saya bekerja dengan sangat baik melalui William Shotts Jr. Linux Command Line pada sistem Mac OSX 10.7.5 saya. 90% dari linux yang dicakup Shotts cukup dekat dengan Darwin sehingga saya bisa mengetahui atau GTEM untuk mencari tahu apa yang terjadi. Saya sudah sampai di bab 27 tentang "Menulis Skrip Shell" dan mulai membuat "file di sini" dalam suatu fungsi.

Saya mendapat syntax error: unexpected end of file kesalahan saat saya menyertakan fungsi berikut:

report_uptime () {
  cat <<- _EOF_
    <H2>System Uptime</H2>
    <PRE>$(uptime)</PRE>
    _EOF_
  return
}

Kesalahan hilang jika saya menggunakan placeholder fungsi berikut:

report_uptime () {
  return
}

Juga, di tempat lain dalam skrip, di luar fungsi saya menggunakan cat << _EOF_ format untuk membuat "file di sini" tanpa kesulitan:

cat << _EOF_
<HTML>
      <HEAD>
            <TITLE>$TITLE</TITLE>
      </HEAD>
      <BODY>
            <H1>$TITLE</H1>
            <P>$TIME_STAMP</P>
            $(report_uptime)
            $(report_disk_space)
            $(report_home_space)
      </BODY>
</HTML>
_EOF_

Jika ada yang tahu kesalahan saya, saya akan berterima kasih!

BenU
sumber
2
Itu EOF token harus menjadi hal pertama di telepon, tanpa spasi putih terkemuka.
Ярослав Рахматуллин
Itu berhasil bagi saya, @ Ярослав_Рахматуллин. Saya tidak berpikir itu [-] adalah opsi untuk file-file Darwin di sini. cat << _EOF_ tidak cat <<- _EOF_
BenU
itu memalukan.
Ярослав Рахматуллин

Jawaban:

4

Jika operator pengalihan adalah ‘& lt; & lt; -’, maka semua karakter tab utama dihapus dari jalur input dan garis yang mengandung pembatas. Hal ini memungkinkan dokumen di dalam skrip shell diindentasikan secara alami.

Jika itu tidak berfungsi seperti yang didokumentasikan, coba pindahkan EOF token ke bagian paling awal dari garis (hapus semua spasi putih).

Ярослав Рахматуллин
sumber
Ini harus bekerja terlepas dari sistem, kecuali versi bash rusak pada sistem Anda.
Ярослав Рахматуллин
Terima kasih @ Ярослав_Рахматуллин Meskipun menambahkan - untuk << tidak memecahkan masalah saya, menghapus spasi sebelum _EOF_ melakukan. Mungkin "di sini dokumen" dengan cat << bekerja di Darwin tetapi tidak cat <<-. Sayang sekali sejak itu <<- sangat berguna. Pindahkan komentar Anda ke jawaban Anda dan saya akan menerimanya. Tambahan: bash mungkin sebenarnya rusak. Mungkin rusak oleh saya, mungkin keterbatasan Darwin Mac ...
BenU
2
@ Ben, perhatikan bahwa halaman manual sangat spesifik di sini: karakter tab tidak ruang putih
glenn jackman
@glennjackman Menggunakan spasi alih-alih tab memang bisa menjadi sumber masalah saya. Saya telah mengatur editor teks saya untuk menggunakan dua spasi alih-alih tab secara default. Terima kasih!
BenU