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.