exec e tee para o arquivo de log: explique estes comandos bash

15

Vi isso no topo do meu arquivo de script bash:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

O que isso faz? O que dois processos exec estão fazendo aqui? Percebo que, dessa maneira, toda a saída da execução do script é canalizada, $LOGFILEmas eu queria entender da perspectiva das execdeclarações.

Senthil Kumaran
fonte
1
Você viu isso no topo do seu arquivo de script bash? ;)
Sebb 25/05
1
As duas execlinhas poderiam perfeitamente ser apenas uma ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler

Respostas:

18

Em shells, exec1) aberturas e redirecionamentos de arquivos 2) reais exec(substituindo a imagem do processo atual por outra imagem do processo).

Estes execs são redirecionamentos.

Primeiro, você redireciona ( exec 1> >(tee $LOGFILE)) o stdoutdescritor (1) para um canal gerado por substituição de processo conectado a um teeprocesso executado simultaneamente que tem $LOGFILEcomo primeiro argumento e, em seguida, redireciona o stderrdescritor (2) para o mesmo local em que o descritor 1agora aponta (o tee tubo).

Tendo em mente que os filedescriptors são herdados, você acabou de fazer com que todo o futuro stdoute a stderrsaída passem para o teeprocesso, que os grava no $LOGFILEe para onde quer que o filedescriptor 1 apontasse originalmente (provavelmente o seu terminal).


Nota: O processo tee é enviado para o stdout original (= o editor de arquivo original 1) porque, como você pode aprender / pesquisar no bash (1) por expansão de comando simples e substituição de processo, a substituição do processo ( >() <()) acontece (junto com outras expansões) antes os redirecionamentos são executados, o que significa que o redirecionamento exec 1> >(tee "$LOGFILE")ocorre após o tee início, deixando teeo mesmo editor de arquivo 1 que ele herdou do shell pai. (Se fosse o contrário, teeseria feito para gravar em sua própria entrada, o que poderia torná-lo um impasse, dependendo do seu padrão de E / S).

PSkocik
fonte