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
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-linuxscript
)
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.
2>&1
>
saída em vez de tee e é por isso que compartilhei a opção de tee.