Saya sedang menulis Makefile, yang akan mencantumkan semua header yang disertakan oleh file a.cpp, b.cpp, dan c.h. Namun, saya mendapatkan kesalahan EOF yang tidak terduga. Pertanyaan serupa selalu disebabkan oleh terminator baris, seperti mereka menggunakan CRLF alih-alih LF untuk EOL. Namun, editor Teks saya disetel untuk menggunakan LF dan saya memeriksa ulang ini dengan menghapus semua EOL dan menambahkannya kembali. Sayangnya, kesalahan masih tetap ada. Berikut kode-kodenya:

#!/bin/bash

list-header:
    for file in a.cpp b.cpp b.h
    do
        echo "$file includes headers: "
        grep -E '^#include' $file | cut -f2
    done

Saya mendapat pesan kesalahan ini:

for file in "Bigram.cpp client.cpp Bigram.h"
/bin/sh: -c: line 1: syntax error: unexpected end of file"

Terima kasih sebelumnya atas bantuan apa pun.

15
Baozi CAI 23 Mei 2015, 15:50
Contoh di mana "akhir file yang tidak terduga" disebabkan oleh format EOL yang berbeda. [link]stackoverflow.com/ pertanyaan/6366530/…
 – 
Baozi CAI
23 Mei 2015, 15:53
2
Makefile bukan skrip bash.
 – 
chepner
23 Mei 2015, 16:42

1 menjawab

Jawaban Terbaik

Catatan pertama Anda harus keluar dari $ yang Anda ingin shell untuk melihat, jika tidak make akan memperluasnya sebelum memanggil shell. Namun, masalah utama Anda adalah bahwa setiap baris logis dalam resep make adalah perintah shell yang terpisah. Jadi, aturan ini:

list-header:
        for file in a.cpp b.cpp b.h
        do
            echo "$file includes headers: "
            grep -E '^#include' $file | cut -f2
        done

Akan menyebabkan make untuk menjalankan perintah shell:

/bin/sh -c 'for file in a.cpp b.cpp b.h'
/bin/sh -c 'do'
/bin/sh -c 'echo "ile includes headers: "'
/bin/sh -c 'grep -E '^#include' ile | cut -f2'
/bin/sh -c 'done'

Anda perlu menggunakan garis miring terbalik untuk "melanjutkan" baris logis melintasi baris baru jika Anda ingin semuanya dikirim ke shell yang sama, dan Anda harus menambahkan titik koma untuk membuatnya berfungsi karena baris baru tidak lagi berfungsi sebagai pembatas perintah:

list-header:
        for file in a.cpp b.cpp b.h; \
        do \
            echo "$$file includes headers: "; \
            grep -E '^#include' $$file | cut -f2; \
        done
27
MadScientist 23 Mei 2015, 15:55
Itu bekerja! Terima kasih atas jawaban super cepat dan penjelasan Anda yang jelas = )
 – 
Baozi CAI
23 Mei 2015, 15:59
Sekarang Anda harus mempertimbangkan untuk menandai ini sebagai jawaban yang diterima dengan mengklik tanda centang di sebelah kiri jawaban ini
 – 
Jahid
23 Mei 2015, 16:03