Solução 1: exec
Você pode colocar um comando exec no início do script:
$ cat script1
#!/bin/bash
exec > >(tee file.log)
echo one
echo two
Aqui está um exemplo de execução de script1:
$ bash script1
$ one
two
$
Observe que o prompt do shell retornou antes que a saída do script fosse concluída. Isso ocorre porque a saída foi para um subprocesso e, devido aos caprichos da multitarefa, ela completa em seu próprio cronograma. Por esse motivo, eu prefiro a segunda solução mostrada abaixo:
Solução 2: agrupamento
Você pode colocar o script inteiro em um grupo de shell, {...}
e, em seguida, redirecionar a saída do grupo:
$ cat script2
#!/bin/bash
{
echo one
echo two
} | tee file.log
Isso pode ser feito para scripts arbitrariamente complexos. Basta colocar {
no início e } | tee file.log
no final.
Uma amostra de corrida é semelhante a:
$ bash script2
one
two
$
Observe que a saída é concluída com perfeição antes que o prompt retorne.