วิธีการส่งออกไปยังหน้าจอและจดหมาย?


9

ฉันใช้สิ่งต่อไปนี้เพื่อส่งอีเมลที่ท้ายสคริปต์

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

อย่างไรก็ตามฉันต้องการที่จะสะท้อนข้อความเดียวกันบนหน้าจอเช่นกัน ฉันจะทำเช่นนั้นในคำสั่งเดียวกันได้อย่างไร

คำตอบ:


19

วิธีที่ง่ายที่สุดน่าจะteeเป็นข้อความถึง stderr และ stdout:

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

teeทำซ้ำอินพุตไปยังหลายปลายทางรวมถึง stdout ตามค่าเริ่มต้น stderr และ stdout จะไปที่หน้าจอ คุณกำลังเปลี่ยนเส้นทาง stdout ไปที่Mailเหลือเพียงแค่ stderr ไปที่หน้าจอ

หากคุณต้องการ stdout ด้วยเหตุผลบางอย่างคุณสามารถเปลี่ยนเส้นทางกลับโดยใช้ subshell (หรืออีกหลายวิธี):

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

3
อีกทางหนึ่งให้ทีไฟล์หรือส่งไฟล์ทางไปรษณีย์ ... มีประโยชน์มากถ้าผลลัพธ์มีขนาดใหญ่มากและคุณต้องการส่งไฟล์เช่นเป็นไฟล์แนบ 64 บิตเข้ารหัส gzipped MIME หรือเพียงแค่เปลี่ยนเส้นทางเอาต์พุตทั้งหมดไปยังไฟล์ (เช่น with exec &> $LOGFILE) จากนั้นกู้คืน stdout, cat file เพื่อ stdout และส่งเมล์
cas

ขอบคุณเครก เนื่องจากข้อความของฉันในกรณีนี้มีขนาดเล็กมากฉันจะไปด้วยการตอบสนองจาก Derobert
แซมมี่

อืม .. มันใช้งานได้ แต่ฉันรู้ว่าฉันต้องเพิ่มคำอธิบายปัญหาให้มากขึ้น ฉันใช้โซลูชันนี้เป็นบรรทัดสุดท้ายของสคริปต์ ฉันใช้คำสั่ง "nohup" บนสคริปต์ของฉันเพื่อรวบรวมผลลัพธ์ทั้งหมดของสคริปต์ของฉันเป็น "nohup.out" และสิ่งที่ฉันเห็นก็คือแค่บรรทัดเดียว "Script เสร็จสิ้นใน xxxxx" ก่อนที่จะใช้โซลูชันนี้ฉันได้ผลลัพธ์สคริปต์ที่ดีทั้งหมด มีวิธีที่ฉันสามารถผนวกเอาท์พุทของหนึ่งบรรทัดสุดท้ายนี้แทนการลบทั้งหมดหรือไม่?
แซมมี่

1
ใช้ "tee -a" เพื่อแก้ไขปัญหา
แซมมี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.