Por que o 'cd' não tem efeito se a saída for canalizada?

3

Eu digitei acidentalmente

cd /tmp | tail

que obviamente não é o que eu quis dizer. Mas, para minha surpresa, eu não mudei de diretório. Por que é isso? Para comparação

cd /tmp > /tmp/foo

faz resultar em uma mudança de diretório, então não é o redirecionamento de saída por si mesmo. O que está acontecendo aqui?

    
por gerrit 22.06.2018 / 18:19

1 resposta

3

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 ...

    
por 22.06.2018 / 18:43