bash pipe xây dựng để chuẩn bị một cái gì đó cho thiết bị xuất chuẩn của lệnh trước đó


25

Tôi muốn sử dụng sendmail để gửi cho tôi công cụ và muốn thực hiện nó trong một oneliner.

echo "mail content" | sendmail emailataddres.com 

Gửi nó mà không có chủ đề.

Dòng tiêu đề phải xuất hiện trước nội dung Thư, vì vậy tôi đang tìm kiếm thứ gì đó dọc theo dòng:

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

sed và awk có xu hướng thực sự khó xử khi sử dụng và ghi nhớ.

EDIT : Chỉ cần làm rõ: echo "Nội dung thư" chỉ là một ví dụ minh họa. Tôi cần có khả năng trả trước công cụ cho các luồng xuất phát từ bất kỳ nguồn nào. ví dụ: ifconfig, zcat, v.v.


echo -e "Subject: All that matters\nmail content"? Hoặc nhiều nền tảng bất khả tri : printf 'Subject: %s\n%s\n' "All that matters" "mail content". Bạn cũng có thể viết một tập lệnh nhỏ chỉ lấy hai đối số chuỗi để tạo một lớp lót đơn giản hơn nữa.
Daniel Andersson

Chà, nếu bạn thêm nó vào như một câu trả lời tôi có thể chấp nhận nó ... :)
AndreasT

à, không, tôi không xin lỗi Hãy xem xét chỉnh sửa của tôi.
AndreasT

Nên prependlàm gì? Để biết cách chuẩn bị một cái gì đó, bạn phải đợi cho đến khi lệnh ngược dòng (ví dụ echo) gửi EOF, để bạn có thể chèn dữ liệu của mình trước luồng đó trước khi truyền nó tới thiết bị xuất chuẩn để gửi đường dẫn đến sendmail. Âm thanh giống như một nhiệm vụ cho một kịch bản Ruby hoặc Python ngắn.
allquixotic

1
Một cách tiếp cận hơi khác sẽ là sử dụng maillệnh (đôi khi được gọi là bsdmail) thay vì sendmailtrực tiếp. mailcó một tùy chọn tùy -s subjectchọn, ví dụ: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis

Câu trả lời:


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

Tôi khá chắc chắn rằng có một giải pháp đẹp hơn, nhưng điều này nên làm.


1
Đơn giản, chức năng và thể hiện. +1
Hennes

Có một cách dễ dàng để làm điều đó mà không cần trả lại?
VenomFangs 21/07/2015

2
@VenomFangs Sử dụng printfthay vì thứ hai echovà bạn sẽ ổn
Trendfischer 24/07/2015

> Có cách nào dễ dàng để làm điều đó mà không phải trả lại tiền không? -echo -n
kyb

6

Hoặc sử dụng những gì Claudius nói hoặc làm cho riêng bạn:

~ / bin / trả trước:

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

ví dụ:

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

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!


6

Điều này được lấy cảm hứng từ câu trả lời của Claudius.

Nếu bạn không muốn trả lại tiền giữa các đầu ra của mình, hãy thêm thông số -n. Điều này sẽ trông giống như:

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

Mà sẽ cho:

21


1
Thật ra, không, nó sẽ không. Nó cho "2 \ n1". Bạn phải gắn "-n" vào tiếng vang thứ hai . Vẫn +1. Nếu bạn sửa nó, tôi có thể chấp nhận nó. Tôi không chắc điều gì công bằng, vì Claudius đóng góp nhiều nhất cho giải pháp.
Andreas

Xin lỗi, nghĩ rằng tôi đặt -nsai chỗ. Dù sao, bản cập nhật sẽ cung cấp "21 \ n" nếu bạn muốn thoát khỏi \ n sau đó chỉ cần thêm một -n trước 1.
VenomFangs

1

Từ những mảnh ghép tôi đã thu thập ... bạn có thể làm một cái gì đó như thế này:

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

Lưu ý rằng tôi đã không đóng dấu ngoặc kép trên dòng đầu tiên ... bởi vì không phải tất cả các shell đều dịch \nthành ký tự dòng mới ... nhưng tôi vẫn chưa tìm thấy một dấu ngoặc kép nào không xử lý một dòng mới thực sự bên trong dấu ngoặc kép.

Khi một lệnh được đặt trong ký tự `, nó sẽ được thực thi và đầu ra sẽ được đưa vào vị trí. Hãy nhớ rằng bit mã này là một chút nguy hiểm vì có thể tiêm thêm các lệnh nội tuyến có thể dễ dàng thỏa hiệp hệ thống của bạn ...

**** chỉnh sửa **** Theo lời khuyên của Claudius, một tùy chọn sạch hơn sẽ như thế này:

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

Ngay cả với mẫu đó, nó có thể được khai thác.


1
Nó thường được sử dụng tốt $()hơn thay vì `` vì nó được cho là dễ mang theo hơn (và cũng dễ đọc hơn). Hơn nữa, bạn có thể sử dụng echo's -etùy chọn để làm cho nó dịch dòng mới ( echo -e "1\n2") hoặc chỉ sử dụng printf theo đề nghị của Daniel trong những nhận xét đầu tiên.
Claudius

Ngay sau khi đăng câu trả lời của tôi ... Tôi đã đọc của bạn và thích nó hơn. Điểm tốt.
TheCompWiz

0

Bạn có thể thêm vào đầu ra đường ống bằng cách sử dụng thay thế quá trình :

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
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.