2012-03-16 48 views
20

Tôi có tập lệnh shell mà tôi đang thực thi trong Cygwin (có thể đây là vấn đề). Đối với mã bit này, tôi chỉ muốn viết dòng đầu tiên và nối thêm ngắt dòng:Nối ngắt dòng vào tệp đầu ra trong tập lệnh shell

echo "`date` User `whoami` started the script." >> output.log 
echo >> output.log 

Nhưng tệp output.log dường như không bao giờ nghỉ ngơi. Nếu tôi chạy tập lệnh nhiều lần, nó giống như tiếng vang thứ hai không ghi vào tệp.

Tôi cũng đã thử:

echo -e "`date` User `whoami` started the script.\n" >> output.log 

Nó mang lại kết quả tương tự.

Điều kỳ lạ là nếu tôi chỉ nhập câu lệnh echo thứ hai ở trên dòng lệnh, mà không phụ thêm vào tệp, nó sẽ cho tôi kết quả mong đợi với dấu ngắt dòng.

+0

Lạ. Làm thế nào để bạn xác định rằng các dòng mới không được thêm vào? –

+0

Trên thực tế, tôi chỉ xem xét nó có vẻ như chương trình tôi đang mở đăng nhập không giải thích LF một cách chính xác, và đang mong đợi ngắt dòng Windows. Nếu tôi đưa ra kết quả đầu ra, nó dường như tôn trọng những giờ nghỉ. – Ode

Trả lời

24

Tôi đặt cược vấn đề là Cygwin đang viết Unix kết thúc dòng (LF) vào tập tin, và bạn đang mở nó với một chương trình dự kiến ​​kết thúc dòng Windows (CRLF). Để xác định xem đây là trường hợp — và cho một chút của một workaround hackish — thử:

echo "`date` User `whoami` started the script."$'\r' >> output.log 

(nơi $'\r' ở cuối là một phụ xe-trở lại; nó, cộng với dòng Unix kết thúc, sẽ cho kết quả trong một dòng Windows kết thúc).

+0

Điều này hoạt động hoàn hảo.Giả thuyết về kết thúc dòng Unix và Windows dường như là vấn đề – Ode

18

Hãy thử:

echo "`date` User `whoami` started the script."$'\n' >> output.log 

hoặc chỉ:

echo $'\n' >> output.log 
+0

Lưu ý rằng lệnh thay thế không được thực hiện trong '$ '...'', do đó phiên bản sẽ in chuỗi, backticks thực và "date" và "whoami" và tất cả, thay vì chạy 'date' và' whoami 'lệnh. – ruakh

+0

@ruakh - Tốt bắt. Tôi không nhận ra rằng. Tôi đã cập nhật câu trả lời của mình. –

+0

"$ '\ n" không hoạt động, cần thiết để thực hiện "$' \ r" từ giải pháp của ruakh. Cảm ơn rất nhiều! – Ode

3

Bạn có thể làm điều đó mà không có một I/O chuyển hướng:

sed -i 's/$/\n/' filename 

Bạn cũng có thể sử dụng lệnh này để thêm một dòng mới vào một danh sách các tập tin:

find dir -name filepattern | xargs sed -i 's/$/\n/' filename 

Đối echo, một số vỏ thực hiện nó như một lệnh nội trang hệ vỏ. Nó có thể không chấp nhận tùy chọn -e. Nếu bạn vẫn muốn sử dụng echo, hãy thử tìm nơi tệp nhị phân echo là sử dụng which echo. Trong hầu hết các trường hợp, nó nằm ở /bin/echo, vì vậy bạn có thể sử dụng /bin/echo -e "\n" để lặp lại một dòng mới.

2

Hãy thử

echo -en "`date` User `whoami` started the script.\n" >> output.log 

Cố gắng phát hành này nhiều lần. Tôi hy vọng bạn đang tìm kiếm cùng một đầu ra.

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