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).

Amelio Vazquez-Reina
fonte
./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 ).

savanto
fonte
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
zzapper
fonte