Czy można przekierować gdzieś wszystkie wyniki skryptu powłoki Bourne'a, ale za pomocą poleceń powłoki w samym skrypcie?
Przekierowanie wyjścia pojedynczego polecenia jest łatwe, ale chcę czegoś takiego:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Znaczenie: jeśli skrypt jest uruchamiany nieinteraktywnie (na przykład cron), zapisz dane wyjściowe wszystkiego do pliku. Jeśli uruchamiany jest interaktywnie z powłoki, pozwól, aby wyjście przechodziło na standardowe wyjście jak zwykle.
Chcę to zrobić dla skryptu normalnie uruchamianego przez okresowe narzędzie FreeBSD. Jest to część codziennego biegu, którego zwykle nie obchodzi mnie codziennie w wiadomości e-mail, więc nie wysyłam go. Jeśli jednak coś w tym konkretnym skrypcie zawiedzie, jest to dla mnie ważne i chciałbym móc przechwytywać i wysyłać pocztą e-mail wyniki tej części codziennych zadań.
Aktualizacja: odpowiedź Jozuego jest natychmiastowa, ale chciałem również zapisać i przywrócić stdout i stderr dookoła całego skryptu, co odbywa się w następujący sposób:
# save stdout and stderr to file descriptors 3 and 4, then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
exec 1>&3 2>&4 3>&- 4>&-