digitei sem querer
cd /tmp | tail
o que obviamente não é o que eu quis dizer. Mas, para minha surpresa, não mudei de diretório. Por que é isso? Para comparação
cd /tmp > /tmp/foo
resulta em uma mudança de diretório, então não é o redirecionamento de saída per sé . O que está acontecendo aqui?
Os pipes envolvem subshells, partes das quais não são executadas no shell pai e, portanto, não podem afetar o diretório de trabalho desse processo do shell pai. É assim que o ZSH se comporta:
Observe como o diretório só mudou quando
cd
foi o último comando no pipeline; isso foi executado no shell pai e, portanto, foi capaz de alterar o diretório de trabalho desse processo.Um uso útil desse recurso geralmente envolve um subshell explícito e comandos executados nele:
também certifique-se de verificar o erro da
cd
chamada em vez de assumir que funcionou, a menos que você gostersync
de saída pulverizada por toda parte/
ou outras bagunças hipotéticas ...