ฉันคิดว่าคุณจะต้องใช้ไฟล์ temp สำหรับการดำเนินการนี้เพื่อให้คุณสามารถใช้&&
โอเปอเรเตอร์เพื่อเรียกใช้คำสั่ง mail เท่านั้นหาก grep ส่งคืนสถานะการออกที่ระบุว่ามันตรงกับสิ่งนี้:
TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"
หากคุณไม่ทราบว่าไฟล์ temp ติดอยู่ที่ใดที่หนึ่งและสามารถใช้ชื่อแบบคงที่ได้คุณสามารถข้ามการตั้งชื่อและการลบแบบพิเศษได้:
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
แก้ไข:หลังจากเห็นคำตอบของ glennฉันเล่นกับสิ่งนี้มากขึ้นและเห็นได้ชัดว่าการกำหนดตัวแปรโดยใช้$()
ไวยากรณ์ส่งคืนรหัสทางออกของคำสั่งดังนั้นคุณสามารถข้ามการทดสอบที่เขาใช้สำหรับความยาวสตริงและใช้แทน นี่คือทั้งหมดในคำสั่งเดียว:
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
แก้ไข 2:หลังจากเห็นคำตอบของ Simonฉันได้ลองดูmail
โปรแกรมของฉัน มันไม่ทำงานในวิธีที่เขาอธิบายโดยค่าเริ่มต้น แต่มีตัวเลือกสำหรับสิ่งนั้น จากหน้าคน:
-E
หากข้อความที่ส่งออกไม่มีข้อความใด ๆ ในส่วนข้อความแรกหรือข้อความเดียวอย่าส่ง แต่ทิ้งไว้เงียบ ๆ ตั้งค่าตัวแปร skipemptybody อย่างมีประสิทธิภาพเมื่อเริ่มต้นโปรแกรม สิ่งนี้มีประโยชน์สำหรับการส่งข้อความจากสคริปต์ที่เริ่มโดย cron (8)
ทำให้เป็นไปได้:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email