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 de shell pai. É assim que o ZSH se comporta:
% cd /tmp
% cd /var/tmp | tail
% pwd
/tmp
% echo foo | cd /var/tmp
(pwd now: /var/tmp)
% cd /tmp
% echo foo | cd /var/tmp | echo bar
bar
% pwd
/tmp
%
Observe como o diretório só mudou quando cd
foi o último comando no pipeline; isso foi executado no próprio shell pai e, portanto, foi capaz de alterar o diretório de trabalho desse processo.
Um uso útil deste recurso geralmente envolve um subshell explícito e comandos executados nele:
dowork | ( cd elsewhere && domorework ) | andyetmore
certifique-se também de verificar o erro cd
call em vez de assumir que funcionou, a menos que você goste de rsync
output espalhado por todo o /
, ou outras tais bagunças hipotéticas ...