<(cmd)
e >(cmd)
são a gramática da shell (chamada de substituição de processo). Eles são substituídos por um caminho de arquivo, por exemplo,
cmd1 <(cmd2)
torna-se
cmd1 /path/to/file
O conteúdo do arquivo é a saída de cmd2
, portanto, ele pode ser lido apenas, mas não gravado. Um exemplo:
start cmd:> ls -l <(echo foo)
lr-x------ 1 hl hauke 64 5. Jan 03:49 /dev/fd/63 -> pipe:[3125128]
Nesse caso, ls
vê /dev/fd/63
como argumento. No seu caso, esse caminho se torna parte de um redirecionamento. Assim, o espaço em branco é obrigatório. > >(cmd)
é "stdout de redirecionamento para um arquivo temporário cujo conteúdo se torna a entrada de cmd", enquanto >>(cmd)
causa um erro porque o shell espera um caminho (ou espaço em branco) após >>
. >>'(cmd)'
"funciona" porque agora (cmd)
é considerado um arquivo:
start cmd:> echo foo >>'(cat)'
start cmd:> cat \(cat\)
foo