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$SCRIPTnão está definido, então o script entra em um loop infinito. - Boa ideia para usar
scriptentretanto, 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.