สร้างทุบตีท่อเพื่อเติมอะไรบางอย่างเพื่อ stdoutput ของคำสั่งก่อนหน้า


25

ฉันต้องการใช้ sendmail เพื่อส่งสิ่งต่าง ๆ และต้องการที่จะทำใน oneliner

echo "mail content" | sendmail emailataddres.com 

ส่งได้โดยไม่มีหัวเรื่อง

หัวเรื่องต้องมาก่อนเนื้อหาเมลดังนั้นฉันกำลังมองหาบางอย่างตามบรรทัดของ:

echo "mail content" | prepend "Subject: All that matters" | sendmail emailataddres.com 

sed และ awk มีแนวโน้มที่จะใช้และจำได้ยาก

แก้ไข : เพียงเพื่อชี้แจง: echo "เนื้อหาจดหมาย" เป็นเพียงตัวอย่างที่แสดงให้เห็น ฉันต้องสามารถเพิ่มเนื้อหาลงในสตรีม stdout จากแหล่งใดก็ได้ เช่น: ifconfig, zcat เป็นต้น


echo -e "Subject: All that matters\nmail content"? หรือแพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้ามากขึ้น: printf 'Subject: %s\n%s\n' "All that matters" "mail content". คุณยังสามารถเขียนสคริปต์ขนาดเล็กที่เพิ่งใช้อาร์กิวเมนต์สตริงทั้งสองเพื่อทำให้เป็นหนึ่งซับที่ง่ายยิ่งขึ้น
Daniel Andersson

ถ้าคุณเพิ่มคำตอบนี้ลงไปฉันอาจยอมรับ ... :)
AndreasT

อ๊ะฉันไม่ขอโทษ โปรดพิจารณาการแก้ไขของฉัน
AndreasT

ควรprependทำอย่างไร? ในการที่จะรู้วิธีการเตรียมบางสิ่งบางอย่างคุณต้องรอจนกระทั่งคำสั่ง upstream (เช่นecho) ส่ง EOF เพื่อให้คุณสามารถแทรกข้อมูลของคุณล่วงหน้าในสตรีมก่อนที่จะส่งไปยัง stdout เพื่อรับ piped ไปยัง sendmail ฟังดูเหมือนงานของสคริปต์ Ruby หรือ Python ที่สั้น
allquixotic

1
แนวทางที่แตกต่างกันเล็กน้อยคือการใช้mailคำสั่ง (บางครั้งเรียกว่า bsdmail) แทนที่จะใช้sendmailโดยตรง mailใช้ตัว-s subjectเลือกเพิ่มเติมเช่น: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis

คำตอบ:


43
$ echo 1 | (echo 2 && cat)
2
1

ฉันค่อนข้างมั่นใจว่ามีทางออกที่ดีกว่า แต่ควรทำเช่นนี้


1
ง่ายการทำงานและแสดงให้เห็นถึง +1
Hennes

มีวิธีง่าย ๆ โดยไม่หยุดพักหรือไม่?
VenomFangs

2
@VenomFangs ใช้printfแทนตัวที่สองechoและคุณควรจะปรับ
Trendfischer

> มีวิธีง่าย ๆ โดยไม่หยุดพักหรือไม่? -echo -n
kyb

6

ใช้สิ่งที่ Claudius พูดหรือทำเอง:

~ / bin / ย่อหน้า:

#!/bin/sh
echo -en "$@"
cat -

เช่น:

$ echo "Splendid SUPANINJA! Let's do it!" |\
     prepend "Subject: Venetian Snares\n"

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!


6

นี่คือแรงบันดาลใจจากคำตอบของคาร์ดินัล

หากคุณไม่ต้องการให้ตัวแบ่งกลับระหว่างเอาต์พุตของคุณให้เพิ่ม-nพารามิเตอร์ จะมีลักษณะดังนี้:

$ echo 1 | (echo -n 2 && cat)

ซึ่งจะให้:

21


1
จริงๆแล้วมันจะไม่ มันให้ "2 \ n1" คุณต้องแนบ "-n" กับเสียงสะท้อนที่สอง ยังคง +1 หากคุณแก้ไขถูกต้องฉันอาจยอมรับมัน ฉันไม่แน่ใจว่ามีอะไรยุติธรรมเพราะ Claudius ให้การช่วยเหลือมากที่สุด
AndreasT

ขออภัยคิดว่าฉันใส่-nผิดที่ อย่างไรก็ตามการอัปเดตควรให้ "21 \ n" หากคุณต้องการกำจัด \ n จากนั้นเพียงเพิ่ม -n ก่อนวันที่ 1
VenomFangs

1

จากชิ้นส่วนที่ฉันรวบรวม ... คุณสามารถทำสิ่งนี้:

echo "Subject: All that matters
`echo "mail content"`" | sendmail blah@blahblah

โปรดสังเกตว่าฉันไม่ได้ปิดเครื่องหมายอัญประกาศในบรรทัดแรก ... เนื่องจากเชลล์ไม่ทั้งหมดแปล\nเป็นอักขระขึ้นบรรทัดใหม่ ... แต่ฉันยังไม่พบสิ่งใดที่จะไม่ประมวลผลบรรทัดใหม่จริงภายในเครื่องหมายคำพูด

เมื่อคำสั่งถูกล้อมรอบด้วยตัวอักษร `มันจะถูกดำเนินการและเอาท์พุทจะถูกฉีดเข้าที่ โปรดทราบว่าโค้ดนี้มีอันตรายเล็กน้อยเนื่องจากสามารถฉีดคำสั่งเพิ่มเติมแบบอินไลน์ซึ่งอาจทำให้ระบบของคุณเสียหายได้ง่าย ...

**** แก้ไข **** ตามคำแนะนำของ Claudius ตัวเลือกที่สะอาดกว่าจะมีลักษณะเช่นนี้:

echo -e "Subject: All that matters \n $(echo "mail content") |sendmail blah@blahblah

แม้จะมีเทมเพลตนั้นก็สามารถใช้ประโยชน์ได้


1
โดยปกติแล้วจะใช้งานได้$()ดีกว่าแทนที่จะใช้`` ตามที่ควรจะเป็นแบบพกพา (และสามารถอ่านได้มากขึ้น) นอกจากนี้คุณสามารถใช้echo's -eตัวเลือกที่จะทำให้มันแปลบรรทัดใหม่ ( echo -e "1\n2") หรือเพียงแค่ใช้เป็น printf แนะนำโดยแดเนียลในความคิดเห็นแรก
Claudius

ทันทีหลังจากโพสต์คำตอบของฉัน ... ฉันอ่านของคุณ & ชอบดีกว่า จุดที่ดี
TheCompWiz

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