O idioma >(...)
significa apenas (em termos leigos): "o nome de um arquivo".
E funciona como um "nome de um arquivo" (mais ou menos tudo ficará claro em um instante):
$ echo <(date)
/proc/self/fd/11
Ou algum outro número / nome no seu sistema operacional. Mas o eco imprime um nome, exatamente como se você fizesse:
$ echo ProcSubs11
ProcSubs11
E se existir um arquivo com o rótulo ProcSubs11, você também pode:
$ cat ProcSubs11
contents_of_file_ProcSubs11
Que você poderia fazer exatamente o mesmo com:
$ cat <(date)
Fri Jan 15 21:25:18 UTC 2016
A diferença é que o nome real da "Substituição do Processo" é "não visível" e que os detalhes são muito maiores do que ler um arquivo simples, como descrito bem em todos os detalhes dolorosos no link Como a substituição do processo é implementada no bash? .
Tendo dito o acima, vamos analisar seus itens.
Q 1
...seems operationally no different from a simple unnamed pipe...
Bem, a "Substituição de processos" é baseada exatamente em um unnamed pipe
, pois o primeiro primeiro link declara:
- The bash process creates an unnamed pipe for communication between the two processes created later.
A diferença é que todas as ~ 6 etapas explicadas no link são simplificadas para um idioma >(...)
para gravação para e <(...)
para leitura de .
E, pode-se argumentar que a conexão (pipe) tem um nome, como um arquivo tem. Só que esse nome está oculto do usuário (o /proc/self/fd/11
mostrado no começo).
Exemplo 1
1) I add a pipe and redirection of shasum's output ...
$ cat file_{1,2,3} | tee file_4 | shasum -a 256 > file_4.sha256
Não há "Substituição de processo", mas vale a pena notar (para depois) que tee
envia (escreve para) o que recebe em seu stdin
para um arquivo file_4
e também envia o mesmo conteúdo de stdin
para stdout
. Que acontece de estar conectado a um pipe (neste caso) que escreve no shasum.
Portanto, em suma, em termos leigos, copie o tft stdin
para ambos file_4
e shasum
.
Exemplo 2
2) I try the same with ProcSub:
$ cat file_{1,2,3} | tee file_4 >(shasum -a 256 > file_4.sha256)
Reutilize a descrição acima (em termos leigos) para descrever este exemplo:
Copie stdin
para três elementos: file_4
, shasum
e stdout
.
Por quê? Lembre-se que >(...)
é o nome de um arquivo, vamos colocar isso na linha:
$ cat file_{1,2,3} | tee file_4 /proc/self/fd/11
tee está servindo a entrada para dois arquivos file_4
e shasum
(via "Substituição de processo") e o stdout
de tee
ainda está conectado ao local padrão: o console. É por isso que você vê os números no console.
Para tornar este exemplo exatamente igual a 1) , poderíamos fazer:
$ cat file_{1,2,3} | tee file_4 > /proc/self/fd/11 ### note the added '>'
O que se torna (sim, o espaço entre >
e >(
deve ser usado.
$ cat file_{1,2,3} | tee file_4 > >(shasum -a 256 > file_4.sha256)
Isso está redirecionando o stdout de tee
para a "Substituição do processo".
Q 3
Q: So the general question is: how are i/o processed for the 3 cases above
Acredito que acabei de explicar os 3 casos, se não for claro, por favor comente.
Q 4 (nos comentários, edite e adicione a pergunta)
why the <(...) construct won't work in the third case.
Porque (em termos leigos) você não pode inserir um macho em uma tomada masculina .
O idioma < (...) lê a partir do que está dentro da "Substituição do processo" e, portanto, fornece uma "saída" e deve ser inserido no stdin
do comando externo. O comando externo tee
está tentando conectar elementos stdout
(like). Então, esse par não poderia corresponder.
Uma importante nota :
O comando cat
oculta alguns detalhes quando aplicado a "Substituição de processos", pois ambos os comandos fornecerão a mesma saída:
$ cat <(date)
$ cat < <(date)
Tudo está correto, mas tirar conclusões de uma igualdade enganosa é errado.