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.
Respostas:
De
man bash
: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/>\(
.fonte
>(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 (>
ou1>
) ou erro padrão (2>
) para um arquivo ou processo.>&2
é redirecionamento de saída, mas, neste caso, a saída detee
é 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:Como você pode ver, o
$foo
que foi definido no subshell é separado daquele definido no shell pai.fonte
>(...)
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á.cmd 2>&1 > output | tee err >&2
>
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()
.