Чи можна перенаправити весь вихід сценарію оболонки Bourne кудись, але з командами оболонки всередині самого сценарію?
Перенаправити вихід однієї команди легко, але я хочу чогось більшого:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Значення: якщо сценарій запускається неінтерактивно (наприклад, cron), збережіть вихід файлу з усього файлу. Якщо запустити інтерактивно з оболонки, відпустіть вихід у stdout як завжди.
Я хочу зробити це для сценарію, який зазвичай виконується періодичною утилітою FreeBSD. Це частина щоденного пробігу, яку я зазвичай не бачу щодня бачити електронною поштою, тому я не надсилаю її. Однак, якщо щось із цього конкретного сценарію виходить з ладу, це для мене важливо, і я хотів би мати можливість отримувати та надсилати по електронній пошті результати цієї частини щоденних завдань.
Оновлення: відповідь Джошуа є точковою, але я також хотів зберегти та відновити stdout та stderr навколо всього сценарію, що робиться так:
# 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>&-