exec e tee para o arquivo de log: explica esses comandos bash

14

Eu 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? Eu percebo que, mantendo assim, toda a saída da execução do script é canalizada para $LOGFILE , mas eu queria entender da perspectiva das declarações exec .

    
por Senthil Kumaran 24.05.2016 / 22:19

1 resposta

18

Em shells, exec faz 1) aberturas e redirecionamentos de arquivos 2)% realexec ing (substituindo a imagem do processo atual por outra imagem do processo).

Esses exec s são redirecionamentos.

Primeiro, você redireciona ( exec 1> >(tee $LOGFILE) ) o stdout descriptor (1) para um canal gerado por substituição de processo conectado a um processo tee executado simultaneamente que tem $LOGFILE como seu primeiro argumento e, em seguida, redireciona o stderr descriptor (2) para o mesmo local onde o descritor 1 agora aponta (o tee pipe).

Tendo em mente que filedescriptors são herdados, você acabou de fazer todos os futuros stdout e stderr output vão para o tee process, que grava para $LOGFILE e para onde quer que o filodescriptor 1 tenha apontado originalmente (provavelmente o seu terminal).

Nota: O processo tee saídas para o stdout original (= o filedescriptor original 1) porque, como você pode aprender com / pesquisando bash (1) para Expansão de Comando Simples e Substituição de Processo , a substituição de processo ( >() <() ) acontece (junto com outras expansões) antes que os redirecionamentos sejam executados, o que significa que o redirecionamento em exec 1> >(tee "$LOGFILE") acontece após tee ter sido iniciado, deixando tee com o mesmo filedescriptor 1 herdado do shell pai. (Se fosse o contrário, tee seria feito para gravar em sua própria entrada, o que poderia torná-lo um impasse, dependendo de seu padrão de IO).

    
por 24.05.2016 / 22:33

Tags