बैश पाइप पिछले कमांड के stdoutput के लिए कुछ तैयार करने के लिए


25

मैं मुझे सामान भेजने के लिए Sendmail का उपयोग करना चाहता हूं और इसे एक ऑन्लाइनर में करना चाहता हूं।

echo "mail content" | sendmail emailataddres.com 

इसे बिना विषय के भेजता है।

विषय पंक्ति मेल सामग्री से पहले आनी चाहिए, इसलिए मैं कुछ लाइनों की तलाश में हूँ:

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

sed और awk वास्तव में उपयोग करने और याद रखने के लिए अजीब होते हैं।

संपादित करें : केवल स्पष्ट करने के लिए: "मेल सामग्री" प्रतिध्वनि एक उदाहरण मात्र है। मुझे किसी भी स्रोत से धाराएं निकालने के लिए सामान तैयार करने में सक्षम होना चाहिए। जैसे: ifconfig, zcat, आदि।


echo -e "Subject: All that matters\nmail content"? या अधिक मंच अज्ञेय printf 'Subject: %s\n%s\n' "All that matters" "mail content":। आप एक छोटी सी स्क्रिप्ट भी लिख सकते हैं जो सिर्फ एक को सरल बनाने के लिए दो स्ट्रिंग तर्क लेती है।
डैनियल एंडरसन

यदि आप इसे उत्तर के रूप में जोड़ते हैं तो मैं इसे स्वीकार कर सकता हूँ ... :)
एंड्रियासटी

आह, नहीं, मुझे खेद नहीं है। कृपया मेरे संपादन का संबंध है।
एंड्रियासटी

क्या करना चाहिए prepend? यह जानने के लिए कि किसी चीज़ को कैसे प्रस्तुत करना है, आपको ईओएफ को echoभेजने के लिए अपस्ट्रीम कमांड (जैसे ) तक इंतजार करना होगा , ताकि आप उसे भेजने से पहले अपने डेटा को स्ट्रीम में पास कर सकें, ताकि उसे भेजने के लिए पाइप किया जा सके। एक छोटे से रूबी या पायथन स्क्रिप्ट के लिए एक कार्य की तरह लगता है।
allquixotic

1
थोड़ा अलग दृष्टिकोण सीधे के mailबजाय कमांड (जिसे कभी-कभी bsdmail कहा जाता है) का उपयोग करना होगा sendmailmailएक वैकल्पिक -s subjectविकल्प लेता है , जैसे: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
विम लुईस

जवाबों:


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

मुझे पूरा यकीन है कि एक अच्छा समाधान है, लेकिन यह करना चाहिए।


1
सरल, कार्यात्मक और प्रदर्शन किया। +1
हेन्स

क्या ब्रेक रिटर्न के बिना इसे करने का एक आसान तरीका है?
वेंमफैंग्स

2
@VenomFangs printfदूसरे के बजाय का उपयोग करें echoऔर आप ठीक होना चाहिए
Trendfischer

> क्या ब्रेक रिटर्न के बिना इसे करने का एक आसान तरीका है? -echo -n
kyb

6

या तो क्लॉडियस ने जो कहा है उसका उपयोग करें या अपना खुद का बनाएं:

~ / 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। यदि आप इसे ठीक करते हैं, तो मैं इसे स्वीकार कर सकता हूं। मुझे यकीन नहीं है कि क्या उचित है, क्योंकि क्लॉडियस ने समाधान में सबसे अधिक योगदान दिया।
एंड्रियास

क्षमा करें, लगता है कि मैंने -nगलत जगह पर डाल दिया । वैसे भी, अपडेट को "21 \ n" देना चाहिए यदि आप \ n से छुटकारा पाना चाहते हैं, तो बस 1 से पहले एक एन
डालें-

1

मेरे द्वारा इकट्ठा किए गए टुकड़ों से ... आप ऐसा कुछ कर सकते हैं:

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

ध्यान दें कि मैंने पहली पंक्ति के उद्धरणों को बंद नहीं किया था ... क्योंकि सभी गोले \nएक नई पंक्ति वर्ण में अनुवाद नहीं करते हैं ... लेकिन मुझे अभी तक एक ऐसा नहीं मिला है जो उद्धरणों के अंदर एक वास्तविक नई पंक्ति को अभ्यस्त न करे।

जब एक कमांड `वर्ण में संलग्न है, तो इसे निष्पादित किया जाएगा और आउटपुट को इन-प्लेस किया जाएगा। ध्यान रखें कि कोड का यह बिट थोड़ा खतरनाक है क्योंकि अतिरिक्त कमांड इनलाइन को इंजेक्ट करना संभव है जो आपके सिस्टम को आसानी से समझौता कर सकता है ...

**** संपादित करें **** क्लॉडियस की सलाह के बाद, एक क्लीनर विकल्प इस तरह दिखेगा:

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

उस टेम्पलेट के साथ भी, इसका फायदा उठाया जा सकता है।


1
यह आमतौर पर $()`` के बजाय उपयोग करने के लिए अच्छा है क्योंकि यह अधिक पोर्टेबल माना जाता है (और अधिक पठनीय भी)। इसके अलावा, आप उपयोग कर सकते हैं echoकी -eयह नई-पंक्तियों (का अनुवाद करने का विकल्प echo -e "1\n2"के रूप में पहली टिप्पणी में डैनियल ने सुझाव दिया) या सिर्फ उपयोग printf।
क्लॉडियस

अपना उत्तर पोस्ट करने के तुरंत बाद ... मैंने तुम्हारा पढ़ा और इसे बेहतर पसंद किया। अच्छे अंक।
theCompWiz 16

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.