No shell do Unix, tenho um arquivo env (o arquivo env define os parâmetros necessários para executar o script do usuário, como nome e caminho do arquivo de log, redireciona as saídas e erros para o arquivo de log, detalhes de conexão do banco de dados, etc ) que redireciona todas as saídas ( mensagens de eco ) e erros no arquivo de log do script executado usando o seguinte código:
exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}
O arquivo env é executado no início de cada script. Devido ao código acima no arquivo env, todas as saídas do console que podem ser saídas do usuário ou erros são enviadas diretamente para o arquivo de log, que é o que eu realmente precisava.
Mas existem algumas saídas de usuário seletivas que desejo que sejam exibidas no console e no arquivo de log. Mas por causa do código acima, não posso fazer isso.
Eu sei que se eu remover o código acima, posso obter o resultado desejado para esse caso, mas terei que escrever manualmente todas as outras saídas no arquivo de log, o que não é uma tarefa fácil.
Existe uma maneira de obter a saída no console e no arquivo de log sem remover os códigos acima?
/dev/fd/3
é um nome de arquivo que se refere ao "fd 3 aberto no momento", entãotee /dev/fd/3
escreverá tudo o que chegar em seu stdin no fd 1 e também no fd 3 (o/dev/fd/3
arquivo). Fd 1 está conectado ao arquivo de log, fd 3 está conectado ao console.echo "blah" | tee file1.txt | tee file2.txt >/dev/null
'Blah' não será colocado em arquivo1.txt e arquivo2.txt, mas não será gravado no console.tee
, que por sua vez grava no terminal) em vez de ir diretamente para um terminal, e ajustar sua saída para corresponder.Sim, você deseja usar
tee
:Basta canalizar seu comando para tee e passar o arquivo como um argumento, assim:
Isso imprime a saída no STDOUT e grava a mesma saída em um arquivo de log. Veja
man tee
para mais informações.Observe que isso não gravará stderr no arquivo de registro, portanto, se você quiser combinar os dois fluxos, use:
fonte
script.sh: line 5: exec: 1: not found
Tentei a resposta de joonty, mas também obtive o
erro. Isso é o que funciona melhor para mim ( confirmado para funcionar no zsh também):
O arquivo /tmp/both.log posteriormente contém
O /tmp/both.log é anexado, a menos que você remova o -a do tee.
Dica:
>(...)
é uma substituição de processo. Permiteexec
que otee
comando seja executado como se fosse um arquivo.fonte
exec > >(tee ${LOG_FILE}) 2>&1
.Eu queria exibir logs em stdout e arquivo de log junto com o carimbo de data / hora. Nenhuma das respostas acima funcionou para mim. Usei substituição de processo e comando exec e vim com o código a seguir. Logs de amostra:
Adicione as seguintes linhas na parte superior do seu script:
Espero que isso ajude alguém!
fonte
para o arquivo de log, você pode inserir dados de texto. o código a seguir pode ajudar
saída: 2. O arquivo de log será criado na primeira execução e continuará sendo atualizado nas próximas execuções. Caso o arquivo de log esteja faltando em uma execução futura, o script criará um novo arquivo de log.
fonte
Eu encontrei uma maneira de obter a saída desejada. Embora possa ser uma forma um tanto heterodoxa. De qualquer forma, aqui vai. No arquivo redir.env, tenho o seguinte código:
Então, no script real, tenho os seguintes códigos:
Aqui, echo as saídas apenas para o console, as saídas de log apenas para o arquivo de log e as saídas de mensagens para o arquivo de log e o console.
Depois de executar o arquivo de script acima, tenho os seguintes resultados:
No console
Para o arquivo de log
Espero essa ajuda.
fonte
Experimente isso, ele fará o trabalho:
fonte
exec > >(tee -a ${log_file} )
funciona perfeitamente para minhas necessidades. As soluções anteriores acima interromperiam partes do meu script que forçariam a saída se falhassem. Obrigadofonte
Acho muito útil anexar stdout e stderr a um arquivo de log. Fiquei feliz em ver uma solução do alfonx com
exec > >(tee -a)
, porque estava me perguntando como fazer isso usandoexec
. Me deparei com uma solução criativa usando a sintaxe here-doc e.
: /unix/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell -roteiroDescobri que no zsh, a solução here-doc pode ser modificada usando a construção "multios" para copiar a saída para stdout / stderr e o arquivo de log:
Não é tão legível quanto a
exec
solução, mas tem a vantagem de permitir que você registre apenas parte do script. Obviamente, se você omitir o EOF, todo o script será executado com o registro. Não tenho certeza de comozsh
implementa multios, mas pode ter menos sobrecarga do quetee
. Infelizmente, parece que não se pode usar multios comexec
.fonte