2013-09-06 54 views
26

Tôi cần tập lệnh của mình để gửi email từ thiết bị đầu cuối. Dựa trên những gì tôi đã nhìn thấy ở đây và nhiều nơi khác trên mạng, tôi định dạng nó như thế này:tại đây-tài liệu cho lỗi 'kết thúc tệp không mong muốn'

/var/mail -s "$SUBJECT" "$EMAIL" << EOF 
Here's a line of my message! 
And here's another line! 
Last line of the message here! 
EOF 

Tuy nhiên, khi tôi chạy này tôi nhận được cảnh báo này:

myfile.sh: line x: warning: here-document at line y delimited by end-of-file (wanted 'EOF') 

myfile.sh: line x+1: syntax error: unexpected end of file 

... nơi dòng x là dòng mã được viết cuối cùng trong chương trình và dòng y là dòng có /var/mail trong đó. Tôi đã thử thay thế EOF bằng những thứ khác (ENDOFMESSAGE, FINISH, v.v.) nhưng không có kết quả. Gần như tất cả mọi thứ tôi đã tìm thấy trực tuyến đã làm nó theo cách này, và tôi thực sự mới tại bash vì vậy tôi đang có một thời gian khó tìm ra nó trên của riêng tôi. Bất cứ ai có thể cung cấp bất kỳ sự giúp đỡ?

+5

Dòng chữ 'EOF' có thụt vào không? Nó phải ở đầu dòng. – Barmar

+0

Đó là, nhưng chỉ như xa như toàn bộ tuyên bố được lồng nhau. Vì vậy, nó phải được tất cả các con đường bên trái? – thnkwthprtls

+2

Ngoài ra, hãy đảm bảo không có ký tự dấu (bao gồm cả dấu xuống dòng!) –

Trả lời

69

Mã thông báo EOF phải ở đầu dòng, bạn không thể thụt lề nó cùng với khối mã đi kèm.

Nếu bạn viết <<-EOF bạn có thể thụt lề, nhưng phải được thụt lề với Tab ký tự, không phải dấu cách. Vì vậy, nó vẫn có thể không kết thúc ngay cả với khối mã.

Cũng đảm bảo bạn không có khoảng trắng sau mã thông báo EOF trên dòng.

2

Hãy cố gắng loại bỏ các khoảng trống preceeding trước EOF: -

/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF 

Sử dụng <tab> thay vì <spaces> cho ident VÀ sử dụng < < -EOF hoạt động tốt.

"-" xóa <tabs>, chứ không phải <spaces>, nhưng ít nhất là công trình này.

+1

Đề xuất đầu tiên sẽ không giúp bạn (bạn đã kiểm tra xem liệu không gian có gây ra sự cố không?). Điều thứ hai sẽ chỉ giúp đỡ nếu dòng EOF được thụt vào với TAB, không phải dấu cách. – Barmar

+0

Tôi nghĩ rằng mã thông báo chấm dứt không được có không gian hàng đầu –

4

Dòng bắt đầu hoặc kết thúc tài liệu tại đây có thể có một số ký tự không in được hoặc khoảng trống ở đây-doc như nó nên. Đây là một lỗi rất phổ biến và khó phát hiện chỉ với một trình soạn thảo văn bản. Bạn có thể làm cho nhân vật không thể in được nhìn thấy ví dụ với cat:

cat -A myfile.sh 

Khi bạn thấy đầu ra từ cat -A giải pháp sẽ được rõ ràng: loại bỏ các nhân vật vi phạm.

-2

Cùng với các câu trả lời khác được đề cập bởi Barmar và Joni, tôi đã nhận thấy rằng đôi khi tôi phải để lại một dòng trống trước và sau EOF khi sử dụng <<-EOF.

+0

Tôi không tìm thấy hỗ trợ nào cho điều này trong cả lý thuyết hoặc thực hành. Downvoting như mê tín dị đoan. – tripleee