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.