stdout_log=$(mktemp -t stdout.log.XXXXXX)
exec >"$stdout_log" # redirect all stdout to file
# ...do things that need to be logged here...
if need_to_mail_the_log; then
exec >/dev/null # closes, and thus flushes, the original log
mail admin <"$stdout_log"
fi
Теперь, если вы хотите, чтобы он tee'd на консоль, которая получает небольшое немного сложнее, так как вам нужно ждать, чтобы выйти из tee
:
stdout_log=$(mktemp -t stdout.log.XXXXXX)
exec 3>"$stdout_log"
exec > >(flock -x 3; tee "$stdout_log")) # send stdout to tee to the file
# ...do things that need to be logged here...
if need_to_mail_the_log; then
exec >/dev/null # close the handle writing to tee
flock -x 3 # grab a lock on the log; this will only succeed after tee exits
mail admin <"$stdout_log"
fi
С вопрос включает в себя «и хранить в переменной» - игнорируя использование почтовой рассылки, приведенное в вашем примере, которое может быть простым:
Если вы хотите отправить журнал по электронной почте, вам необязательно загружать его в переменную вообще, даже если вы хотите добавить верхние и нижние колонтитулы; a heredoc может это сделать для вас:
mailx [email protected] -s "log from some process" <<EOF
Hey! I ran that thing you asked for, and got this message:
$(<"$stdout_log")
Please look into it; thanks!
EOF
В чем проблема? Что вы не видите вывод на консоли сразу? –
@ EtanReisner, я предполагаю, что проблема в том, что тэ не удалил все на диск, когда содержимое на диске отправляется по почте ... но, действительно, поскольку OP не описывает проблему подробно, она приходит вплоть до угадывания. –
Извините за запутанность, @CharlesDuffy был прав, проблема для меня: когда произошла какая-то ошибка, я хочу сбросить все содержимое stdout в сообщения электронной почты администраторам, однако в этот момент процесс «tee» пока еще начиная с момента запуска скрипта. –