2009-04-19 36 views
10

Tôi đang viết một makefile trong bash và tôi có mục tiêu trong đó tôi cố gắng tìm tệp nếu tồn tại và mặc dù tôi nghĩ cú pháp là chính xác, tôi vẫn cho tôi một lỗi.Lỗi cú pháp: kết thúc tệp bất ngờ (mong đợi "fi")

Đây là kịch bản mà tôi đang cố gắng để chạy

read: 
     if [ -e testFile] ; then \ 
     cat testFile\ 
     fi 

Tôi đang sử dụng các tab để đó không phải là một vấn đề.

Lỗi này là (khi tôi gõ vào: "làm cho đọc")

if [ -e testFile] ; then \ 
     cat testFile \ 
     fi 
/bin/sh: Syntax error: end of file unexpected (expecting "fi") 
make: *** [read] Error 2 

Trả lời

13

Hãy thử thêm một dấu chấm phẩy sau cat testFile. Ví dụ:

read: 
    if [ -e testFile ] ; then cat testFile ; fi 

cách khác:

read: 
    test -r testFile && cat testFile 
+1

giải pháp thay thế hoạt động nhưng tôi phải sử dụng cú pháp if..then. thêm dấu chấm phẩy dường như không giải quyết được vấn đề. – Jaelebi

+0

Lạ. Tôi đã thử nó lần đầu tiên với dấu chấm phẩy và nó không hoạt động. Lần thứ hai tôi chạy nó nó đã làm việc. Cảm ơn – Jaelebi

+0

Chỉ cần một lưu ý cho bản thân: Ban đầu tôi đã viết các câu lệnh 'bash' đơn giản trong makefile, và có cùng một lỗi - và như chú thích câu trả lời này, mẹo là để cho makefile nhận ra lệnh shell dưới dạng một dòng; do đó tôi cần _both_ dấu chấm phẩy ';' (để tách các lệnh shell) _and_ dấu gạch chéo ngược '\\' (để thoát khỏi dòng mới tiếp theo) để làm cho nó hoạt động ... Chúc mừng! – sdaau

2

Tôi cũng đã gặp vấn đề này.

Và lý do là tôi đã thêm một số nhận xét sau "\".

5

Tôi đã gặp sự cố tương tự. Điều này sẽ làm điều đó:

file: 
    @if [ -e scripts/python.exe ] ; then \ 
    echo TRUE ; \ 
    fi 
2

Từ GNU Make 3,82, bạn có thể thêm .ONESHELL: để phía trên cùng của tập tin để nói làm để chạy tất cả các dòng trong một mục tiêu trong một vỏ duy nhất.

.ONESHELL: 
SHELL := /bin/bash 

foobar: 
    if true 
    then 
     echo hello there 
    fi 

Xem documentation.

Đường dây đầu tiên với @ hoặc thêm tùy chọn .SILENT: bên dưới .ONESHELL: để chặn đường lặp lại.

+0

mẹo nhỏ, tôi nghĩ rằng có một lỗi nhỏ trong đó, dòng đầu tiên nên nói .ONESHELL: – Hemeroc

+0

@Hemeroc Đã sửa lỗi. – Evidlo

Các vấn đề liên quan