Questão Tee um script para arquivar dentro de si


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.


2


origem




Respostas:


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.


6



A abordagem tee funciona bem e agora estou usando. Existe uma maneira (usando data) para timestamp cada linha, bem como com esta abordagem? - Brydon Gibson
@BrydonGibson Experimente: ... | while read -r line; do echo "$(date +%Y-%m-%d-%H:%M:%S)" "$line"; done | tee file.log - John1024
Isso vai marcar a hora também, não é? No momento estou trabalhando em tee-to para um pipe nomeado e, em seguida, usando um método semelhante ao seu. - Brydon Gibson
Atualize para isso: Crie um pipe nomeado, crie um loop while (como o seu) em segundo plano, mas, em vez disso, leia a partir de um pipe nomeado, então execute o script e tee o arquivo. O loop de segundo plano aguarda a saída para o pipe e o script é executado sem problemas. - Brydon Gibson