Estou fazendo um script para atualizar o sistema (Ubuntu 22.04), atualizando todos os pacotes em apt, flatpak e snap com uma ordem (como sudo ./update.sh
) e, caso algo dê errado, quero salvar a saída em um arquivo. Eu tenho duas maneiras de fazer isso.
Uma delas é redirecionar a saída padrão de cada pedido com "tee", como:
echo "### apt update:\n" | tee update.out
apt update | tee -a update.out
# etc, etc all with "| tee -a update.out"
Qual é o tipo de repetição que você deseja evitar na programação.
A outra maneira de fazer isso é usando "tee" chamando o próprio script como:
sudo ./update.sh | tee update.out
Mas se eu quiser esse comportamento por padrão, a jogada inteligente é colocar isso dentro do script, certo?
Como eu poderia fazer isso, para que quando eu fizer sudo ./update.sh
, ele envie toda a saída para a tela e para o arquivo de saída?
Você pode colocar esta linha no topo do seu script:
Por exemplo:
Nota : se você estiver usando um shell diferente de Bash ou Zsh, pode ser necessário substituir (de uma forma mais portátil)
|&
por2>&1 |
Você pode colocar todo o script entre colchetes e canalizar a saída para
tee
.Este primeiro exemplo deve ser usado apenas caso você queira registrar apenas stdout e caso os erros não sejam motivo de preocupação; veja o segundo exemplo para uma solução melhor (este exemplo tem o efeito adverso/desejado de não preservar o stderr no arquivo de saída, e o efeito adverso de não preservar a ordem do stdout/stderr no terminal, em geral sugiro que você apenas use o segundo método que irá Just Work(tm).
Isso registrará stdout e stderr, sem efeitos colaterais :
A resposta de @bizmutowyszymon é melhor se você quiser registrar tudo (todo o script, stdout e stderr) no terminal e no arquivo; uma vantagem de usar esse método é que você pode decidir seletivamente para quais grupos de comandos enviar: