-
a | b
conectaSTDOUT
dea
eSTDIN
deb
usando apenasdup/dup2
. Ambos os comandos são executados em paralelo. -
a =(b)
substitui o argumento pora
por um nome de arquivo temporário.b
será executado antes dea
, pois o arquivo temporário precisa ser criado antes de ser passado paraa
-
a <(b)
substitui o argumento pora
por um canal nomeado.a
eb
são executados em paralelo. Agora é aí que fica um pouco complicado:•
b
está em segundo plano e não consegue ler o terminal. Você mesmo pode testá-lo usandostrace -p $PID
para anexar ao seu segundo processo de gato para ver o processo.•
a
, enquanto isso, tenta ler o pipe nomeado, mas não consegue ler nada, já queb
não pode ler.• Isso significa que você basicamente tem um deadlock no qual
a
tenta lerb
, masb
não pode lerSTDIN
e não pode gravar ema
Mais informações sobre o processo em segundo plano e o terminal de homem bash :
To facilitate the implementation of the user interface to job control, the operating system maintains the notion of a current terminal process group ID. Members of this process group (processes whose process group ID is equal to the current terminal process group ID) receive keyboard-generated signals such as SIGINT. These processes are said to be in the foreground. Background processes are those whose process group ID differs from the terminal's; such processes are immune to keyboard-generated signals. Only foreground processes are allowed to read from or, if the user so specifies with stty tostop, write to the terminal. Background processes which attempt to read from (write to when stty tostop is in effect) the terminal are sent a SIGTTIN (SIGTTOU) signal by the kernel's terminal driver, which, unless caught, suspends the process.