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

11

Eu preciso registrar stdout e stderr nos arquivos de log, 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 eu encontrei em algum lugar na web.

Eu só quero saber como isso >(tee copyError.txt >&2)é chamado? Não consigo pesquisar no Google, pois o Google ignora caracteres como colchetes angulares e parênteses.

dersimn
fonte
Redirecionamento de arquivo ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik
@terdon Eu acho que o OP tem afirmado que queria log StdOut e StdErr aos arquivos, mas também ainda mostram StdErr na tela
Dmitry Avtonomov

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 páginas de manual pressionando /e digitando sua sequência de pesquisa, o que é uma boa maneira de encontrar informações como essa. É claro que exige que você saiba em qual página de manual procurar :)

Você deve citar o (item, porque ele tem um significado especial ao pesquisar. Para encontrar a seção relevante na página de manual do bash, digite />\(.

Martin von Wittich
fonte
Eu faço muito bash, então fiz um man bash> bashman.txt e o fiz somente para leitura. Agora, posso carregar o bashman.txt em outra janela no meu editor de texto (somente leitura) e usar todas as facilidades do editor para pesquisar, copiar e colar.
Joe
8

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

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

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

  • Sem >, parênteses ( ()) iniciarão um subshell. A execução de 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 $fooque foi definido no subshell é separado daquele definido no shell pai.

terdon
fonte
4
Não, >(...)não é um redirecionamento. >(...)é expandido para um nome de arquivo. Se você deseja redirecionar a saída para isso, precisa, > >(...)mas >(...)é mais geralmente usado, onde os redirecionamentos não podem ser usados. O comando do OP pode ser alcançado com tubos tradicionais, não há necessidade de substituição de processo por lá.
Stéphane Chazelas
@StephaneChazelas Seria bom ver a solução que você tinha em mente #
Dmitry Avtonomov
3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas
@StephaneChazelas thx!
Dmitry Avtonomov
A primeira metade desta resposta está errada, ou pelo menos altamente enganosa; é verdade que >pode denotar redirecionamento de saída e que ()pode denotar um subshell, mas >(...)na verdade é um recurso único e unitário que não consiste em >e ().
Ruakh