O pipe configura o stdout para ir de ls para o subshell.
No subshell, cd /tmp e cat são feitos no mesmo processo.
cd /tmp não lê de stdin (o pipe), então quando cat lê de stdin, obtém toda a saída de ls .
Eu tenho a seguinte série de comandos:
cd / && ls | ( cd /tmp && cat >dumpfile)
Esta série de comandos faz o seguinte: cria um arquivo chamado /tmp/dumpfile . Este arquivo contém uma listagem do diretório raiz.
A saída cd / && ls é canalizada para um subshell. O que eu acho estranho é que no subshell, em vez de cd /tmp engolir a saída ls , o último cat >dumpfile obtém e grava em um arquivo. O que está acontecendo aqui?
O pipe configura o stdout para ir de ls para o subshell.
No subshell, cd /tmp e cat são feitos no mesmo processo.
cd /tmp não lê de stdin (o pipe), então quando cat lê de stdin, obtém toda a saída de ls .
cd não engole a saída porque não quer. Considere isto:
{ ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile)
Somente o último cat >dumpfile salvará o stdin proveniente do pipe, porque nenhum dos outros comandos deseja consumi-lo.