como enviar saída padrão e erro padrão para dois arquivos

0

Eu uso a seguinte sintaxe para enviar saída padrão e erro padrão para $ log file

log=/var/tmp/install.log
info=/tmp/info.log 

exec > $log 2>&1

como redirecionar a saída padrão e o erro padrão também para o arquivo /tmp/info.log?

    
por yael 28.01.2018 / 10:51

3 respostas

1

A tarefa é preservar a saída do log mesmo que um aplicativo exclua o arquivo de log.

Ao criar um segundo nome para o arquivo de log com ln , os dados no log estarão disponíveis sob dois nomes. Se um dos nomes for excluído, os dados ainda estarão disponíveis sob o outro nome.

Em um script:

log=/var/tmp/install.log
info=/tmp/info.log 

ln -f "$log" "$info"

exec >"$log" 2>&1

Se $log não existir anteriormente, você precisará criá-lo com touch "$log" antes da chamada para ln .

Isto assume que ambos os nomes residem no mesmo sistema de arquivos.

Esta resposta não supõe que você esteja usando bash . Ele funcionará com qualquer shell sh -compatible.

    
por 28.01.2018 / 11:08
2

Se você estiver usando o bash, poderá usar a substituição de processo e tee :

exec &> >(tee "$log" > "$info")

Isso redirecionará os dois fluxos para a substituição do processo, em que tee enviará a saída para "$log" e para stdin, que será redirecionado para "$info" .

Caso contrário, você provavelmente terá que iniciar um processo em segundo plano que envie o conteúdo de /var/tmp/install.log para /tmp/info.log :

log=/var/tmp/install.log
info=/tmp/info.log 
exec > "$log" 2>&1
tail -n+1 -f "$log" > "$info" &

tail será executado em segundo plano enviando tudo o que chega a /var/tmp/install.log a /tmp/info.log .

    
por 28.01.2018 / 11:08
-1

Apenas para fins de conclusão, você pode escrever 1 > como apenas > já que o descritor de arquivo padrão é a saída. então 1 > e > é a mesma coisa.

Então, comando 2 > erro 1 > saída torna-se, comando 2 > erro > saída

    
por 29.01.2018 / 07:19