Wie sende ich eine Ausgabe sowohl an den Bildschirm als auch an die E-Mail?

9

Ich verwende Folgendes, um eine E-Mail am Ende eines Skripts zu senden.

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "[email protected]".

Ich möchte jedoch dieselbe Nachricht auch auf dem Bildschirm wiedergeben. Wie mache ich das in derselben Aussage?

sammy
quelle

Antworten:

18

Der einfachste Weg ist wahrscheinlich teedie Nachricht an stderr sowie stdout:

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "[email protected]"

teedupliziert seine Eingabe an mehrere Ziele, einschließlich stdout. Standardmäßig werden sowohl stderr als auch stdout auf dem Bildschirm angezeigt. Sie leiten stdout zu weiter Mailund lassen nur stderr auf den Bildschirm.

Wenn Sie es aus irgendeinem Grund in stdout benötigen, können Sie es mithilfe einer Subshell (oder auf verschiedene andere Arten) zurückleiten:

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "[email protected]"
) 2>&1
derobert
quelle
3
Alternativ können Sie eine Datei abschlagen und dann die Datei per E-Mail senden ... sehr nützlich, wenn die Ausgabe sehr groß ist und Sie sie senden möchten, z. B. als base64-codierter MIME-Anhang mit GZIP. oder leiten Sie einfach alle Ausgaben in eine Datei um (z. B. mit exec &> $LOGFILE) und stellen Sie dann stdout wieder her, katzen Sie die Datei in stdout und senden Sie sie per E-Mail.
Cas
Vielen Dank, Craig. Da mein Text in diesem Fall sehr klein ist, werde ich mit der Antwort von derobert gehen.
Sammy
Hmm .. das hat funktioniert, aber mir wurde klar, dass ich meiner Problembeschreibung mehr hinzufügen musste. Ich habe diese Lösung als letzte Zeile meines Skripts verwendet. Ich habe einen "nohup" -Befehl in meinem Skript verwendet, um die gesamte Ausgabe meines Skripts als "nohup.out" zu erfassen. Ich sehe nur diese eine Zeile "Skript fertig auf xxxxx". Vor der Verwendung dieser Lösung wurde die gesamte Skriptausgabe in Ordnung gebracht. Gibt es eine Möglichkeit, die Ausgabe dieser letzten Zeile anzuhängen, anstatt alles zu löschen?
Sammy
1
Die Verwendung von "tee -a" löste das Problem.
Sammy