실수로 들어갔는데
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
/