Eu estou familiarizado com o uso de tee, e eu sei que posso simplesmente registrar a saída com
script.sh | tee file.log
No entanto, quero uma interface perfeita para o usuário. Existe uma maneira de, dentro de script.sh, executar tee como se estivesse sendo feito como acima? Dentro desse script existem centenas de ecos e muitos outros scripts sendo executados, seria difícil anexar individualmente cada arquivo.
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, 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. Apenas coloque {
no começo e } | tee file.log
no fim.
Uma amostra de corrida se parece com:
$ bash script2
one
two
$
Observe que a saída é concluída com perfeição antes do prompt retornar.