Решение 1: Exec
Вы можете поместить команду exec в начале скрипта:
$ cat script1
#!/bin/bash
exec > >(tee file.log)
echo one
echo two
Вот пример запуска script1:
$ bash script1
$ one
two
$
Обратите внимание, что приглашение оболочки вернулось до завершения вывода из сценария. Это связано с тем, что выходные данные отправлялись в подпроцесс и из-за капризов многозадачности выполнялись по собственному расписанию. По этой причине я предпочитаю второе решение, показанное ниже:
Решение 2: группировка
Вы можете поместить весь сценарий в группу оболочки {...}
, а затем перенаправить вывод из группы:
$ cat script2
#!/bin/bash
{
echo one
echo two
} | tee file.log
Это можно сделать для произвольно сложных скриптов. Просто поставьте {
в начале и } | tee file.log
в конце.
Примерный прогон выглядит так:
$ bash script2
one
two
$
Обратите внимание, что вывод аккуратно завершается до возвращения приглашения.