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).