Tee um script para arquivar dentro de si

2

Estou familiarizado com o uso do tee e sei que posso simplesmente fazer o log da 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 adicionar individualmente cada um ao arquivo.

    
por Brydon Gibson 22.07.2016 / 22:27

1 resposta

6

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.

    
por 22.07.2016 / 23:26

Tags