Tôi nghĩ rằng bạn sẽ phải sử dụng tệp tạm thời cho thao tác này để bạn có thể sử dụng &&
toán tử để chỉ chạy lệnh thư nếu grep trả về trạng thái thoát cho biết nó có khớp như sau:
TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"
Nếu bạn không bận tâm đến tệp tạm thời ở đâu đó và có thể sử dụng tên tĩnh cho nó, bạn có thể bỏ qua các công cụ đặt tên và xóa đặc biệt:
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
Chỉnh sửa: Sau khi thấy câu trả lời của glenn, tôi đã chơi thêm một số điều này và rõ ràng việc gán một biến bằng $()
cú pháp trả về mã thoát của lệnh, vì vậy bạn có thể bỏ qua bài kiểm tra mà anh ta đã sử dụng cho độ dài chuỗi và thay vào đó sử dụng. Đây là tất cả trong một lệnh:
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
Chỉnh sửa 2: Sau khi thấy câu trả lời của Simon, tôi đã xem mail
chương trình của mình . Nó không hành xử theo cách anh ấy mô tả theo mặc định, nhưng có một tùy chọn cho điều đó. Từ trang người đàn ông:
-E
Nếu một tin nhắn gửi đi không chứa bất kỳ văn bản nào trong phần tin nhắn đầu tiên hoặc duy nhất của nó, đừng gửi nó mà hãy loại bỏ nó một cách im lặng, thiết lập hiệu quả biến Skipemptybody khi khởi động chương trình. Điều này rất hữu ích để gửi tin nhắn từ các tập lệnh được bắt đầu bởi cron (8).
Làm điều này có thể:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email