Capture toda a saída de um script para um arquivo (do próprio script) [duplicar]

Esta pergunta já tem respostas aqui :

Comentários

  • Para aqueles que acabam aqui do Google, você também pode considerar esta resposta ( unix.stackexchange.com/a/164017/103505 ) para apenas colocar todo o código você deseja gerar uma função no script e, em seguida, redirecionar a saída dessa função.

Resposta

Um método que descobri para capturar todas as saídas de qualquer sessão é iniciar uma nova sessão bash e iniciar um arquivo de log. é realmente útil para rastrear mais do que apenas um script.

 bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended 

ou você pode apenas tee o script por conta própria

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Comentários

  • Sua solução aborda STDOUT, mas não STDERR
  • Coloquei um exemplo com 2>&1
  • Não ' acho que isso responda à pergunta porque o requisito nº 1 foi " executado ./myscript.sh sem construções de shell adicionais ".
  • Esta pergunta foi editada 6 horas atrás, eu não ' Não tinha essa informação quando respondi à pergunta pela primeira vez. Estava usando > saída em vez de tee e é por isso que compartilhei a opção de tee.

Resposta

Você sempre pode invocar script dentro de um script para registrar tudo.

Como imprimir e registrar tudo ao mesmo tempo em um script bash para log.txt:

Ver o registro log.txt:

$ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018 

Comentários

  • Se bem entendi (algumas explicações ajudariam :), o script está tentando detectar se ' está sendo executado em script, e não se reexecutar. No Ubuntu 20, parece que $SCRIPT não está definido, então o script entra em um loop infinito.
  • Boa ideia para usar script entretanto, porque permite saída de terminal interativo, por exemplo Retorno de carruagem para o trabalho. Na verdade, os comandos que exibem saída de progresso de uma linha (arquivadores, por exemplo), se comportam normalmente . Quanto à solução do problema do loop infinito, podemos testar o nível do shell : if (( $SHLVL < 3 )); then script...; fi.
  • Além disso, os argumentos dos scripts acabam sendo concatenados e passados no argumento code para o shell iniciado por script (não /bin/bash, esse argumento /bin/bash é ignorado com util-linux script)

Resposta

Você quer usar o tee .

Ex:

echo "Hello World" | tee out.txt 

Isso cria um arquivo out.txt com a saída do comando e o imprime na tela. Use “tee -a filename” se quiser anexar ao arquivo.

echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

out.txt terá duas linhas Hello e World (sem -a it teria apenas mundo)

Se você quiser salvar o script inteiro e gerar a saída de todo o script:

./script.sh | tee output.txt 

Comentários

  • Sua solução aborda STDOUT, mas não STDERR
  • unix.stackexchange.com/a/61932/268823 explica como fazer STDOUT e STDERR
  • Não ' acho que isso responde à pergunta porque o requisito nº 1 era " execute ./myscript.sh sem construções de shell adicionais ".
  • Acho que uma maneira de fazer isso seria para colocar tudo em uma função e usar o tee no final. Isso funcionaria efetivamente como um início e uma interrupção na captura. E redirecionando o STDERR se essa for a intenção.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *