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" "[email protected]".

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

sammy
źródło

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" "[email protected]"

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" "[email protected]"
) 2>&1
derobert
źródło
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