bash boru yapısı bir önceki komutun stdoutput başa


25

Bana bir şeyler göndermek için sendmail kullanmak istiyorum ve bunu bir onelinerda yapmak istiyorum.

echo "mail content" | sendmail emailataddres.com 

Konu olmadan gönderir.

Konu satırı Posta içeriğinden önce gelmelidir, bu yüzden satırlarında bir şey arıyorum:

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

sed ve awk kullanmak ve hatırlamak gerçekten garip olma eğilimindedir.

EDIT : Sadece açıklığa kavuşturmak için: echo "Posta içeriği" sadece açıklayıcı bir örnektir. Herhangi bir kaynaktan akış stdout şeyler başa edebilmek gerekir. örneğin: ifconfig, zcat vb.


echo -e "Subject: All that matters\nmail content"? Ya da daha platformu agnostik: printf 'Subject: %s\n%s\n' "All that matters" "mail content". Ayrıca, daha basit bir astar oluşturmak için iki dize bağımsız değişkenini alan küçük bir komut dosyası da yazabilirsiniz.
Daniel Andersson

Bunu bir cevap olarak eklerseniz kabul edebilirim ... :)
AndreasT

ah, hayır, özür dilerim. Lütfen düzenlememi dikkate al.
AndreasT

Ne prependyapmalı? Bir şeyi nasıl başlatacağınızı bilmek için, yukarı akış komutunun (örn. echo) EOF'u göndermesini beklemeniz gerekir ; böylece, postayı göndermek için stdout'a geçmeden önce verilerinizi akışa yerleştirebilirsiniz. Kısa bir Ruby veya Python betiği görevi gibi geliyor.
allquixotic

1
Biraz farklı bir yaklaşım mail, sendmaildoğrudan yerine komutu (bazen bsdmail olarak adlandırılır) kullanmak olacaktır . mailisteğe bağlı bir -s subjectseçenek alır , örneğin: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis

Yanıtlar:


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

Güzel bir çözüm olduğundan eminim, ama bunu yapmalı.


1
Basit, işlevsel ve kanıtlanmış. +1
Hennes

Ara vermeden yapmanın kolay bir yolu var mı?
VenomFangs

2
@VenomFangs printfİkinci yerine kullanın echove iyi olmalısınız
Trendfischer

> Ara vermeden yapmanın kolay bir yolu var mı? -echo -n
kyb

6

Claudius'un söylediklerini kullanın veya kendinizinkini yapın:

~ / Bin / başa getirebilir:

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

Örneğin:

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

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!


6

Bu Claudius'un cevabından ilham alıyor.

Çıktılarınız arasında mola vermek istemiyorsanız, -nparametreyi ekleyin . Bu şöyle görünecektir:

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

Hangi verecek:

21


1
Aslında hayır olmayacak. "2 \ n1" verir. "-N" yi ikinci ekoya iliştirmelisiniz . Hala +1. Bunu düzeltirseniz, kabul edebilirim. Neyin adil olduğundan emin değilim, çünkü Claudius çözüme en fazla katkıda bulundu.
AndreasT

Üzgünüm, -nyanlış yere koyduğumu düşünüyorum . Her neyse, \ n'den kurtulmak istiyorsanız güncellemenin "21 \ n" değerini vermesi gerekir. Daha sonra 1'den önce bir -n ekleyin.
VenomFangs

1

Topladığım parçalardan ... böyle bir şey yapabilirsin:

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

İlk satırdaki tırnak işaretlerini kapatmadığımma dikkat edin ... çünkü tüm kabuklar \nsatırsonu karakterine dönüşmez ... ancak tırnak içinde gerçek bir satırsonu işlemeyecek bir tane bulamadım.

Bir karakter `karakterine dahil edildiğinde, yürütülür ve çıktı yerinde enjekte edilir. Bu kodun biraz tehlikeli olduğunu unutmayın, çünkü sisteminizi kolayca tehlikeye atabilecek ek komutları satır içi enjekte etmek mümkündür ...

**** edit **** Claudius'un tavsiyesi üzerine, daha temiz bir seçenek şöyle görünecektir:

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

Bu şablonla bile sömürülebilir.


1
$()`` Daha taşınabilir (ve daha okunabilir) olması gerektiği için kullanmak genellikle daha iyidir. Ayrıca, yeni satırları çevirmek için echo' -eseçeneğini echo -e "1\n2"kullanabilir veya ilk yorumda Daniel tarafından önerilen printf'yi kullanabilirsiniz.
Claudius

Cevabımı gönderdikten hemen sonra ... Ben seninkini okudum ve daha çok beğendim. Güzel nokta.
TheCompWiz

0

Proses ikamesi kullanarak borulu çıkışa başlayabilirsiniz :

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.