Enviar cópia da saída de um script para um arquivo


10

Digamos que eu tenha um script Zsh e que gostaria de deixá-lo imprimir STDOUT, mas também copie (despejo) sua saída para um arquivo em disco.

Além disso, o script começa com a seguinte opção

set -o xtrace

o que força a ser detalhado e imprimir os comandos que executa. Gostaria de capturar essa saída também em um arquivo em disco.

Meu entendimento é que se eu fizer

./my_script.sh > log.txt

será apenas enviado STDOUTpara log.txt, mas e se eu também quiser ver a saída no terminal?

Eu li sobre teee a MULTIOSopção no Zsh, mas não sei como usá-los.

Quando eu faço:

./my_script | tee log.txt

Eu posso ver a saída no terminal, mas o arquivo não log.txtparece estar capturando tudo (na verdade, ele captura quase nada).


./my_script.sh > log.txt 2>&1
mikeserv

Parece que você está procurando o scriptcomando. Ou talvezmyscript >&1 > log.txt 2>&1
Stéphane Chazelas

Respostas:


12

Pode ser que o seu script esteja produzindo saída para stdoute stderr, e você esteja obtendo apenas uma dessas correntes no arquivo de log.

./my_script.sh | tee log.txtrealmente enviará tudo para o terminal, mas somente será despejado stdoutno arquivo de log.

./my_script.sh > log.txt 2>&1 fará o contrário, despejando tudo no arquivo de log, mas não exibindo nada na tela.

O truque é combinar os dois com tee:

./myscript.sh 2>&1 | tee log.txt

Isso redireciona stderr( 2) para stdout( 1) e, em seguida, canaliza stdoutpara tee, o que o copia no terminal e no arquivo de log.

O zshequivalente multios seria:

./myscript.sh >&1 > log.txt 2>&1

Ou seja, redirecione o stdout para o stdout original e para o log.txt (internamente por meio de um canal para algo que funcione como esse tee) e, em seguida, redirecione o stderr para ele também (para o canal para o teeprocesso interno ).


Obrigado - Em relação à sua última linha, por que não ./myscript.sh >&1 2>&1 > log.txt? (ou seja, alternando a ordem dos dois últimos redirecionamentos). Haveria alguma diferença entre eles?
Amelio Vazquez-Reina

Sua variante não gera stdout, apenas para log.txt. A última linha da resposta (adicionada por @ StéphaneChazelas e não por mim) é exibida para ambos.
savanto

0

o nohup permite que um trabalho continue, mesmo que o console morra ou esteja fechado, útil para backups prolongados, etc., mas aqui estamos usando o log automático.

nohup myscript.sh & ; tail -f nohup.out
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.