Bash-Pipe-Konstrukt, um dem Standardausgang des vorherigen Befehls etwas voran zu stellen


25

Ich möchte sendmail verwenden, um mir Inhalte zu senden, und möchte dies in einem Oneliner tun.

echo "mail content" | sendmail emailataddres.com 

Sendet es ohne Betreff.

Die Betreffzeile muss vor dem E-Mail-Inhalt stehen, daher suche ich nach etwas in der Art von:

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

sed und awk neigen dazu, sehr umständlich zu sein und sich zu erinnern.

EDIT : Nur zur Verdeutlichung: Echo "Mail-Inhalt" ist nur ein anschauliches Beispiel. Ich muss in der Lage sein, den Standard-Streams von jeder Quelle etwas voran zu stellen. zB: ifconfig, zcat, etc ..


echo -e "Subject: All that matters\nmail content"? Oder mehr plattformunabhängig: printf 'Subject: %s\n%s\n' "All that matters" "mail content". Sie können auch ein kleines Skript schreiben, das nur die beiden Zeichenfolgenargumente verwendet, um einen noch einfacheren Einzeiler zu erstellen.
Daniel Andersson,

Nun, wenn Sie dies als Antwort hinzufügen, könnte ich es akzeptieren ... :)
AndreasT

Ah, nein, tut mir leid. Bitte beachten Sie meine Bearbeitung.
AndreasT

Was soll prependich tun? Um zu wissen, wie Sie etwas voranstellen müssen, müssen Sie warten, bis der Upstream-Befehl (z. B. echo) die EOF sendet, damit Sie Ihre Daten davor in den Stream einfügen können, bevor Sie sie an stdout übergeben, um an sendmail weitergeleitet zu werden. Klingt nach einer Aufgabe für ein kurzes Ruby- oder Python-Skript.
allquixotic

1
Ein etwas anderer Ansatz wäre, den mailBefehl (manchmal bsdmail genannt) anstelle von sendmaildirekt zu verwenden. mailkann optional gewählt werden -s subject, z. B .: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis,

Antworten:


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

Ich bin mir ziemlich sicher, dass es eine schönere Lösung gibt, aber das sollte reichen.


1
Einfach, funktional und demonstriert. +1
Hennes

Gibt es eine einfache Möglichkeit, ohne die Pause zurückzukehren?
VenomFangs

2
@VenomFangs Verwenden Sie printfanstelle der zweiten echound Sie sollten in Ordnung sein
Trendfischer

> Gibt es eine einfache Möglichkeit, ohne die Pause zurückzukehren? -echo -n
kyb

6

Verwenden Sie entweder das, was Claudius gesagt hat, oder machen Sie es sich selbst:

~ / bin / prepend:

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

z.B:

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

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!


6

Dies ist inspiriert von Claudius Antwort.

Wenn Sie keine Unterbrechung zwischen Ihren Ausgängen -nwünschen , fügen Sie den Parameter hinzu. Das wird so aussehen:

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

Welches wird geben:

21


1
Nein, das wird es nicht. Es gibt "2 \ n1". Sie müssen das "-n" an das zweite Echo anhängen . Immer noch +1. Wenn Sie das korrigieren, kann ich das akzeptieren. Ich bin mir nicht sicher, was fair ist, da Claudius am meisten zur Lösung beigetragen hat.
AndreasT

Tut mir leid, denke ich habe das -nan die falsche Stelle gesetzt. Wie auch immer, das Update sollte "21 \ n" ergeben, wenn Sie das \ n loswerden möchten.
Fügen Sie

1

Aus den Stücken, die ich gesammelt habe, könnte man so etwas machen:

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

Beachten Sie, dass ich die Anführungszeichen in der ersten Zeile nicht geschlossen habe, da nicht alle Shells das \nZeichen in ein Zeilenumbruchzeichen umwandeln. Ich muss jedoch noch eines finden, das in den Anführungszeichen kein tatsächliches Zeilenumbruchzeichen verarbeitet.

Wenn ein Befehl in das Zeichen `eingeschlossen ist, wird er ausgeführt und die Ausgabe wird an Ort und Stelle eingefügt. Denken Sie daran, dass dieser Code ein bisschen gefährlich ist, da es möglich ist, zusätzliche Befehle in die Zeile einzufügen, die Ihr System leicht gefährden können ...

**** bearbeiten **** Nach Empfehlung von Claudius würde eine sauberere Option so aussehen:

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

Auch mit dieser Vorlage könnte es ausgenutzt werden.


1
Es ist normalerweise $()besser zu benutzen als ``, da es portabler (und auch lesbarer) sein soll. Darüber hinaus können Sie verwenden echo‚s -eOption , um auf neue Zeilen (zu machen übersetzen echo -e "1\n2") oder Verwendung printf wie Daniel in dem ersten Kommentar vorgeschlagen.
Claudius

Sofort nach dem Posten meiner Antwort ... habe ich deine gelesen und mag es besser. Gute Argumente.
TheCompWiz

0

Sie können der Pipe-Ausgabe mithilfe der Prozessersetzung voranstellen :

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.