Qual é o nome do recurso de shell '(tee copyError.txt & 2)'?

11

Eu preciso logar stdout e stderr para logfiles, mas apenas mostrar as mensagens de erro na tela. Eu posso fazer isso com:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Que encontrei em algum lugar na Web.

Eu só quero saber como essa coisa >(tee copyError.txt >&2) é chamada? Eu não posso google para isso, uma vez que o Google ignora caracteres como colchetes e parênteses ..

    
por dersimn 21.09.2013 / 17:36

2 respostas

11

De man bash :

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan‐
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out‐
       put of list.

Você pode pesquisar manpages pressionando / e, em seguida, digitando sua string de pesquisa, que é uma boa maneira de encontrar informações como esta. É claro que requer que você saiba em qual página de manual pesquisar:)

Você tem que citar o ( , porque ele tem um significado especial ao pesquisar. Para encontrar a seção relevante na bash manpage, digite />\( .

    
por 21.09.2013 / 17:40
8

>(tee copyError.txt >&2) é, na verdade, alguns recursos diferentes:

  • >(...) é chamado de 'substituição de processo'. Ele cria um arquivo pipe nomeado em /dev/fd e a gravação nesse arquivo fornecerá entradas para o processo entre parênteses.

  • > : em geral, isso é chamado de "redirecionamento de saída" e permite enviar uma saída padrão ( > ou 1> ) ou erro padrão ( 2> ) para um arquivo ou processo. >&2 é o redirecionamento de saída, mas, neste caso, a saída de tee é enviada para o erro padrão (é o que representa &2 , &1 é a saída padrão)

  • Sem > , parênteses ( () ) iniciarão uma subchave. Executar comandos entre parênteses gerará outro shell que só existirá enquanto esses comandos estiverem em execução. Você pode ver como isso funciona se você declarar uma variável no subshell:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom
    

    Como você pode ver, o $foo que foi definido no subshell é separado daquele definido no shell pai.

por 21.09.2013 / 17:54

Tags