Wie kann ich diesen Befehl so umschreiben, dass nur E-Mails gesendet werden, die von der ausgegeben werden mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Ist das überhaupt in einer Zeile möglich?
Siehe Überprüfen Sie, ob Rohr leer ist , und einen Befehl auf dem Daten ausgeführt werden, wenn dies nicht der Fall für einen allgemeineren Fall als E - Mail zu senden.
Antworten:
Ich denke, Sie müssen eine temporäre Datei für diesen Vorgang verwenden, damit Sie die verwenden können
&&
Operator verwenden können, um den E-Mail-Befehl nur auszuführen, wenn das grep einen Beendigungsstatus zurückgegeben hat, der besagt, dass Übereinstimmungen wie diese vorliegen:Wenn es Ihnen nichts ausmacht, wenn die temporäre Datei irgendwo bleibt und Sie einen statischen Namen dafür verwenden können, können Sie das spezielle Benennungs- und Lösch-Zeug überspringen:
Bearbeiten: Nachdem ich Glenns Antwort gesehen hatte, spielte ich noch ein bisschen damit und anscheinend gab die Zuweisung einer Variablen mithilfe der
$()
Syntax den Exit-Code des Befehls zurück, sodass Sie den Test, den er für die String-Länge verwendet hat, überspringen und stattdessen verwenden können. Hier ist alles in einem Befehl:Edit 2: Nachdem ich Simons Antwort gesehen hatte, habe ich mein
mail
Programm ausgecheckt. Es verhält sich nicht so, wie er es standardmäßig beschreibt, hat aber eine Option dafür. Von der Manpage:Möglich machen:
quelle
mktemp
nichts zurückgeben, was zitiert werden muss.glob(split(var))
. Sie brauchen hier keine Wortteilung oder Dateiglob-Erweiterung, fragen Sie also nicht danach. Außerdem müssen wir auf dieser Website den richtigen Weg zeigen .zsh
und bekomme in solchen Fällen kein Globbing oder keine Wortspaltung, es sei denn, ich frage nach ihnen, aber um hier Antworten zu finden und die Zielumgebung nicht zu kennen, ist es in Ordnung, aus Prinzip zu zitieren.Das Hilfsprogramm ifne existiert ausdrücklich zu diesem Zweck: um einen Befehl auszuführen, wenn die Standardeingabe nicht leer ist.
Der Befehl ifne ist Teil des moreutils- Pakets, das als "wachsende Sammlung von Unix-Werkzeugen" bezeichnet wird, die vor langer Zeit, als Unix noch jung war, noch niemand geschrieben hatte.
quelle
Sie können die Ausgabe in einer Variablen speichern und dann den Befehl mail aufrufen, wenn die Länge der Zeichenfolge nicht Null ist.
Verbinden Sie für eine Zeile die beiden Befehle mit einem Semikolon.
quelle
Verwenden Sie
mail
mit der-E
Option. Auf meinem Mac sagt MAIL (1), dass die-E
Flagge keine E-Mails mit einem leeren Körper sendet.Auf meinem Mac habe ich den folgenden Test ausgeführt. Beachten Sie, dass die Datei
file_does_exist
vorhanden ist, aber die Dateifile_does__not_exist
nicht vorhanden ist.Dies schickt mir eine E-Mail:
Das tut nicht. Beachten Sie, dass der Befehl
ls file_does_not_exist | egrep ...
keine Ausgabe erzeugt.quelle
In diesem speziellen Fall verwenden Sie diese Option einfach , wenn sie von Ihnen
mail
unterstützt wird-E
. Im allgemeinen Fall können Sie versuchen, ein Zeichen zu lesen. Wenn es einen gibt, starten Sie den Nachverarbeitungsbefehl und geben Sie das Zeichen aus dem Rest der Datei ein.Beachten Sie die nützliche Verwendung von
cat
. Das Hinzufügen vonecho .
bewirkt, dass diese Funktion auch dann funktioniert, wenn das erste Zeichen in der Eingabe eine Newline ist (denken Sie daran, dass das$(…)
Konstrukt terminale Newlines entfernt).Wenn die Datei bei den meisten Shells (soweit ich weiß, nicht zsh) mit einem Nullzeichen beginnt, wird dieser Code glauben, dass sie leer ist. Fixierung, die als Übung für den Leser bleibt. (Hinweis: Verwenden Sie diese
od
Option in der ersten Unterschaleprintf
, um das erste Byte zu drucken.) (Lösung: Überprüfen, ob die Pipe leer ist. ) Das gleiche Problem tritt möglicherweise auf, wenn die Datei mit einem Byte beginnt, das im aktuellen Zeichen nicht gültig ist locale; Das ist einfacher zu beheben, indem Sie diesen Code mit ausführenLC_ALL=C
.quelle
read
Hilfe dies vereinfachen?read
in portable sh unterscheiden können (es kann in bash, ksh oder zsh möglich sein).IIRC Der BSD-
mail
Befehl wird abgebrochen, wenn eine leere Nachricht ausgegeben wird.quelle
-E
Option, um es zu aktivieren .Kürzlich habe ich über den Befehlsnamen erfahren, der
ifne
Teil desmoreutils
Pakets ist. Wo können Sie es verwenden, um dieses spezielle Problem zu lösen.Beispiel aus der Manpage,
quelle
Sie können Ihren Befehl mit umschreiben, um
test -s /dev/stdin
zu überprüfen, ob dasmailq | grep
Teil eine Ausgabe enthält .quelle