Significado de '2 (comando)' Redirecionamento no Bash

13

Há algum tempo atrás, criei um script e adicionei alguns logs em torno dele, mas esqueci como o redirecionamento do logging funciona: - (

A essência disso é:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Quando executo o script, ele não imprime nada em stdout , mas apenas imprime o que vai para stderr . O arquivo de log ${LOGFILE} captura stdout e stderr.

Quando executo o script e não há saída no meu terminal, sei que está tudo bem. Se houver alguma saída, sei que algo deu errado e posso verificar o arquivo de log para descobrir qual é o problema.

A parte do redirecionamento que agora me intriga é a sintaxe de: 2> >( some command )

Alguém pode explicar o que está acontecendo lá?

    
por NZD 18.11.2016 / 01:42

1 resposta

19

>(...) é chamado de substituição de processos . Ele permite que o programa "externo" grave no programa "interno" como se fosse um arquivo.

Nesse caso, está escrevendo stderr a tee -a ${LOGFILE} >&2 , que será anexado a LOGFILE e, em seguida, também gravará tudo novamente em stderr .

O operador de redirecionamento pode ir em qualquer direção para substituição de processo, para que você possa gravar nele, como neste exemplo, ou usar <(...) para ler a partir dele, o que é uma maneira prática de, por exemplo, executar while loop sem executá-lo em uma subshell em si.

    
por 18.11.2016 / 01:54