명령의 경로 이름 출력을 "cd"로 리디렉션할 수 없는 이유는 무엇입니까?

명령의 경로 이름 출력을 "cd"로 리디렉션할 수 없는 이유는 무엇입니까?

cd다른 명령에서 리디렉션할 디렉터리 이름을 수락 하려고 합니다 . 다음 방법 중 어느 것도 작동하지 않습니다.

$ echo $HOME | cd
$ echo $HOME | xargs cd

이것은 작동합니다:

$ cd $(echo $HOME)

첫 번째 명령 세트가 작동하지 않는 이유는 무엇입니까? 이런 식으로 실패하는 다른 명령도 있습니까?

답변1

cd외부 명령이 아니라 쉘 내장 기능입니다. 외부 명령과 같이 분기/실행 컨텍스트에서 별도의 프로세스가 아닌 현재 셸의 컨텍스트에서 실행됩니다.

세 번째 예제는 내장 함수를 호출하기 전에 쉘이 변수와 명령 대체를 확장하여 값을 인수로 받기 cd때문에 작동합니다.cd${HOME}

POSIX 시스템하다바이너리가 있습니다 cd. 내 FreeBSD 컴퓨터에 바이너리가 있지만 /usr/bin/cd여러분이 생각하는 대로 작동하지 않습니다. 바이너리를 호출하면 cd쉘이 바이너리를 분기/실행하게 되며 실제로 작업 디렉터리가 전달한 이름으로 변경됩니다. 그러나 이 작업이 완료되면 바이너리가 종료되고 분기/실행된 프로세스가 사라지고 쉘로 돌아갑니다. 쉘은 시작되기 전의 디렉토리에 여전히 남아 있습니다.

답변2

cd표준 입력은 읽혀지지 않습니다. 이것이 첫 번째 예가 작동하지 않는 이유입니다.

xargs독립 실행형 실행 파일의 이름인 명령 이름이 필요합니다. cd쉘 내장이어야 하며, 실행 가능하다면 아무 효과가 없습니다(해당 디렉토리로 변경할 수 있는지 확인하고 자동 마운트 가능한 디렉토리에 잠재적인 부작용이 있는지 확인하는 것 외에는). 이것이 두 번째 예가 작동하지 않는 이유입니다.

답변3

기존의 좋은 답변 외에도 파이프가 별도의 작업 디렉토리가 있는 새로운 프로세스를 분기한다는 점도 언급할 가치가 있습니다. 따라서 이렇게 하려고 해도 작동하지 않습니다.

echo test | cd /

따라서 쉘이 명령에서 반환된 후에는 / 폴더에 있지 않습니다.

답변4

다른 사람들이 말했듯 cd이 외부 프로그램이 아닌 쉘 내장이기 때문에 작동하지 않습니다. 따라서 파이프할 표준 입력이 없습니다.

그러나 작동하더라도 원하는 것은 수행되지 않습니다. 파이프는 새 프로세스를 생성하고 첫 번째 명령의 표준 출력을 두 번째 명령의 표준 입력으로 리디렉션하므로 새 프로세스만 현재 작업 디렉터리를 변경하지 않습니다. 어떤 식으로든 첫 번째 프로세스에 영향을 미칩니다.

관련 정보