Eu tenho um script bash com muita saída e gostaria de mudar esse script (não criar um novo) para copiar toda a saída em um arquivo, exatamente como aconteceria se eu estivesse passando o tee pelo tee.
Eu tenho um arquivo script.sh :
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
e gostaria de fazer uma cópia do STDOUT em um arquivo script.log sem precisar digitar ./script.sh | tee script.log
todas as vezes.
Obrigado Tom
Respostas:
Eu não conseguia fazer o one-liner muito simples de Dennis funcionar, então aqui está um método muito mais complicado. Eu tentaria o primeiro dele.
Como mencionado, você pode usar exec para redirecionar o erro padrão e o padrão para o script inteiro. Assim:
exec > $LOGFILE 2>&1
Isso produzirá todos os stderr e stdout para $ LOGFILE.Agora, como você deseja que isso seja exibido no console e também em um arquivo de log, você também precisará usar um pipe nomeado para o exec escrever e o tee para ler.
(O one-liner de Dennis tecnicamente também faz isso, embora obviamente de uma maneira diferente). O pipe em si é criado
mkfifo $PIPEFILE
. Então faça o seguinte.Se você quiser ser completo, poderá criar e destruir o arquivo de pipe nomeado no início e no final do seu script.
Para constar, eu colhi a maior parte disso no post muito informativo de um cara aleatório: ( Versão arquivada )
fonte
Basta adicionar isso ao início do seu script:
Isso anexará toda a saída enviada ao stdout ao arquivo
script.log
, deixando o conteúdo anterior no lugar. Se você deseja começar do zero sempre que o script for executado, adicione-orm script.log
imediatamente antes desseexec
comando ou remova-o-a
dotee
comando.A
-i
opção faztee
com que ignore os sinais de interrupção e pode permitirtee
capturar um conjunto de saída mais completo.Adicione esta linha para também capturar todos os erros (em um arquivo separado):
Os espaços entre os vários
>
símbolos são importantes.fonte
Esta é a versão combinada da resposta postada por Dennis Williamson anteriormente. Anexa err e std no script.log na ordem correta.
Adicione esta linha ao início do seu script:
Observe o espaço entre os
>
sinais. Funciona para mim no GNU bash, versão 3.2.25 (1) -release (x86_64-redhat-linux-gnu)fonte
Suponho que outra abordagem seja algo assim:
fonte
Se você deseja uma cópia da saída, pode usar
tee
desta maneira:No entanto, isso só registrará stdout no script.log. Se você deseja garantir que o stderr e o stdout sejam redirecionados, use:
Você pode até torná-lo um pouco melhor com uma pequena função:
fonte
2>&1
fora e daria um tapa.Você usaria isso:
Isso gera tudo para esse log, tudo, além de exibi-lo na tela. Se você deseja a saída COMPLETA, é assim que se faz.
E você pode reproduzir o script novamente se tiver preguiça.
fonte
script
é um pacote, por exemplo.sudo apt-get install script
para instalá-lo em distribuições com sabor Debian , adicionalmentescript -ac 'command opts' ~/Documents/some_log.script
pode ser revisado dentro de um terminal através de algo comostrings ~/Documents/some_log.script | more
;strings
ser uma maneira simples de pré-higienizar algumas das coisasscript
injetadas para permitir métodos mais sofisticados de reprodução / exibição. Caso contrário, uma resposta sólida @ Phhishy, porquescript
também preserva coisas interativas.Você pode ver mais sobre como isso funciona aqui: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/
fonte
tee
.