Làm thế nào để gửi đầu ra cho cả màn hình và thư?


9

Tôi sử dụng cách sau để gửi email ở cuối tập lệnh.

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com".

Tuy nhiên, tôi cũng muốn lặp lại thông điệp tương tự trên màn hình. Làm thế nào để tôi làm điều đó trong cùng một tuyên bố?

Câu trả lời:


19

Cách dễ nhất có lẽ là gửi teetin nhắn đến thiết bị xuất chuẩn cũng như thiết bị xuất chuẩn:

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"

teesao chép đầu vào của nó tới nhiều đích, bao gồm cả thiết bị xuất chuẩn. Theo mặc định, cả stderr và stdout đều đi đến màn hình; bạn đang chuyển hướng stdout sang Mail, chỉ để stderr đi đến màn hình.

Nếu bạn cần nó trong thiết bị xuất chuẩn vì một số lý do, bạn có thể chuyển hướng nó trở lại bằng cách sử dụng một lớp con (hoặc một số cách khác):

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"
) 2>&1

3
cách khác, tee đến một tệp và sau đó gửi tệp ... rất hữu ích nếu đầu ra rất lớn và bạn muốn gửi nó, ví dụ, như một tệp đính kèm MIME được mã hóa cơ sở 64. hoặc chỉ chuyển hướng tất cả đầu ra sang một tệp (ví dụ với exec &> $LOGFILE) và sau đó khôi phục thiết bị xuất chuẩn, đưa tệp đó vào thiết bị xuất chuẩn và gửi thư.
cas

Cảm ơn bạn Craig. Vì văn bản của tôi trong trường hợp này là rất nhỏ, tôi sẽ đi với phản hồi từ derobert.
sammy

Hmm .. điều này đã làm việc tuy nhiên tôi nhận ra rằng tôi cần thêm nhiều hơn vào mô tả vấn đề của mình. Tôi đã sử dụng giải pháp này như là dòng cuối cùng của kịch bản của tôi. Tôi đã sử dụng lệnh "nohup" trên tập lệnh của mình để thu thập tất cả đầu ra của tập lệnh của mình là "nohup.out" và tất cả những gì tôi thấy chỉ là một dòng "Tập lệnh đã hoàn thành trên xxxxx". Trước khi sử dụng giải pháp này, tôi đã nhận được tất cả các đầu ra kịch bản tốt. Có cách nào để tôi có thể nối đầu ra của dòng cuối cùng này thay vì xóa tất cả không?
sammy

1
Sử dụng "tee -a" đã giải quyết vấn đề.
sammy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.