Jak wysłać dane wyjściowe do ekranu i poczty?


9

Korzystam z poniższych, aby wysłać wiadomość e-mail na końcu skryptu.

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com".

Chcę jednak także powtórzyć tę samą wiadomość na ekranie. Jak to zrobić w tym samym oświadczeniu?

Odpowiedzi:


19

Najprostszym sposobem jest prawdopodobnie przesłanie teewiadomości do stderr i stdout:

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"

teeduplikuje dane wejściowe do wielu miejsc docelowych, w tym stdout. Domyślnie zarówno stderr, jak i stdout przechodzą do ekranu; przekierowujesz stdout na Mail, pozostawiając po prostu stderr idący na ekran.

Jeśli z jakiegoś powodu potrzebujesz go na standardowym wyjściu, możesz przekierować go z powrotem za pomocą podpowłoki (lub kilku innych sposobów):

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "myaccount@myserver.com"
) 2>&1

3
alternatywnie, przejdź do pliku, a następnie prześlij plik ... bardzo przydatne, jeśli wynik jest ogromny i chcesz go wysłać, np. jako zakodowany w formacie base64 załącznik MIME. lub po prostu przekieruj wszystkie dane wyjściowe do pliku (np. za pomocą exec &> $LOGFILE), a następnie przywróć standardowe wyjście, ustaw plik na standardowe wyjście i wyślij go pocztą.
cas

Dziękuję Craig. Ponieważ mój tekst w tym przypadku jest bardzo mały, przejdę do odpowiedzi deroberta.
sammy

Hmm .. to zadziałało, ale zdałem sobie sprawę, że muszę dodać więcej do opisu problemu. Użyłem tego rozwiązania jako ostatniego wiersza mojego skryptu. Użyłem polecenia „nohup” na moim skrypcie, aby zebrać wszystkie dane wyjściowe skryptu jako „nohup.out”, a wszystko, co widzę, to tylko jeden wiersz „Skrypt zakończony na xxxxx”. Przed użyciem tego rozwiązania udało mi się uzyskać wszystkie wyniki skryptu. Czy istnieje sposób, w jaki mogę dołączyć wynik tego ostatniego wiersza zamiast kasować to wszystko?
sammy

1
Użycie „tee -a” rozwiązało problem.
sammy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.