출력이 파이프로 연결되면 "cd"가 아무런 효과가 없는 이유는 무엇입니까?

출력이 파이프로 연결되면 "cd"가 아무런 효과가 없는 이유는 무엇입니까?

실수로 들어갔는데

cd /tmp | tail

내가 의도한 것은 확실히 그런 것이 아니다. 그러나 놀랍게도 나는 이후에 디렉토리를 변경하지 않았습니다. 왜 이런거야? 비교하려고

cd /tmp > /tmp/foo

하다디렉터리 변경을 발생시키므로 그 자체로는 출력 리디렉션이 아닙니다. 여기서 무슨 일이 일어나고 있는 걸까요?

답변1

파이프라인에는 하위 셸이 포함되며, 그 중 일부는 상위 셸 내에서 실행되지 않으므로 상위 셸 프로세스의 작업 디렉터리에 영향을 주지 않습니다. ZSH는 다음과 같이 동작합니다:

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

cd디렉터리는 파이프라인의 마지막 명령에서만 변경됩니다. 이는 상위 셸에서 실행되므로 프로세스의 작업 디렉터리가 변경됩니다.

이 기능의 유용한 용도에는 일반적으로 명시적인 하위 셸 및 그 안에서 실행되는 명령이 포함됩니다.

dowork | ( cd elsewhere && domorework ) | andyetmore

또한 출력이 여기저기에 뿌려지는 것이 마음에 들지 않거나 기타 가상적인 혼란이 발생 cd하지 않는 한 작동한다고 가정하기보다는 호출을 오류 확인 하십시오 .rsync/

관련 정보