`cd` 외부 명령의 요점은 무엇입니까?


71

이 훌륭한 답변 에서 언급했듯이 POSIX 시스템에는 cd셸 내장 외에도 외부 바이너리 가 있습니다. OS X 10.8에서는 /usr/bin/cd입니다. cd자체 작업 디렉토리를 변경 한 후 즉시 종료 되므로 내장처럼 사용할 수 없습니다 . 어떤 목적으로 사용됩니까?


Ubuntu와 CentOS (따라서 Red Hat) /usr/bin/cd에는 쉘이 내장되어 있지 않습니다 .
Keith Thompson

1
나의 Fedora 19는 포함되어 있습니다 /bin/cd.
slm

1
데비안 (현재 테스트를 포함하여 여러 릴리스를 확인했습니다)도도 /bin/cd없습니다 /usr/bin/cd.
derobert

1
이 시스템이 POSIX가 아니라고 생각합니다. 다른 사람들처럼. :)
kojiro

답변:


64

그것은 주로 POSIX 도구 - 가슴 내부와 쉘합니다 (참조 밖에 볼 수 있습니다 확인하는 역할 들을 요구에 대한 POSIX의 이론적 근거를 ).

의 경우 cd매우 유용하지는 않지만 cd디렉토리 를 변경하지만 다른 부작용이 있음에 유의하십시오 . 종료 상태를 반환하여 chdir()해당 디렉토리에 액세스 할 수 있는지 여부를 판별 하고 유용한 이유를 설명하는 유용한 오류 메시지를 출력합니다. chdir()당신이 할 수 없을 때.

예:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

또 다른 잠재적 부작용은 디렉토리의 자동 마운트입니다.

일부 시스템에서는 표준 셸 내장에 대한 대부분의 외부 명령이 다음과 같은 스크립트에 대한 심볼릭 링크로 구현됩니다.

#! /bin/sh -
"${0##*/}" "$@"

그것은 쉘을 시작하고 내장을 실행하는 것입니다.

GNU와 같은 일부 다른 시스템에는 실제 실행 가능한 명령으로 유틸리티가있어 동작이 셸 내장 버전과 다를 경우 혼동 될 수 있습니다.


2
부작용 및 오류 메시지에 대한 관찰은 +1입니다. 유닉스의 많은 영리한 관용구가 부작용을주의 깊게 사용함으로써 온다는 것은 새로운 사용자에게 항상 잘 설명되어 있지는 않습니다. 그리고 매뉴얼 페이지 자체는 더 큰 그림을 잘 설명하지 못했습니다.
RBerteig

SO에 대한 비슷한 질문에서 왔는데 "디렉토리의 자동 마운트"라고 말할 때 의미하는 바를 자세히 설명해 주시겠습니까?
ffledgling


1
Stéphane Chazelas의 생각을 조금 풀기 위해 : 자동 디렉토리가 변경되지 않고 파일을 읽으려고 시도하지 않고 실제로 마운트 가능한지 확인해야하는 경우 외부 cd명령을 사용할 수 있습니다 . 자동 마운트 가능한 원격 파일 시스템의 가용성을 모니터링하거나 시간이 중요한 작업을 수행하기 전에 유용 할 수 있습니다.
telcoM

11

비 내장 CD 명령을 사용할 수있는 사실은 POSIX의 본질적으로 인해 요구 사항 모든 정규 내장 명령이 간부 가족의 명령에 의해 호출 될하기에 env, find, nice, nohup, timexargs이러한 명령 중 일부는 자체 내장 명령으로 구현되지 않는 사실에 결합했다.

cd이 명령과 결합하는 것이 의미가 없기 때문에 의미가 없습니다 . 다음은 다소 유력한 예입니다.

find . -type d -exec cd {} \;
env HOME=/foo cd

2
다수의 내장 기능이 실제로 해당 규칙에서 제외됩니다 . 이상하게도 cd는 그중 하나가 아닙니다.
Kevin

5
나는 그것이 모두를위한 요구 사항입니다 쓴 @Kevin 정규 내장 명령 , 면제 된 사람은 특별한 내장 매크로 : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unset동안 외부 명령으로 관련이없는 것이다 cd명령으로 일부 문서화 된 사용 사례가있는 일반 내장입니다.
jlliagre

1

경로가 액세스 가능한 디렉토리에 해당하는지 확인하는 것 외에도 cd실행 파일은 CDPATH변수를 처리하고 사용하며 , 성공적으로 사용 된 경우 해결 된 디렉토리의 절대 경로를 인쇄합니다 .

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

이것은 매우 유용한 경우가 많지만 일치하는 디렉토리를 검색하기 위해 동일한 논리를 다시 구현하는 것을 절약합니다. 구체적인 유스 케이스는 여러 가능한 상위에서 특정 이름의 첫 번째 기존 디렉토리를 찾는 것입니다.

cd또한 처리 OLDPWD를 위해 cd -,하지만 환경 변수가 이미 사용할 수 있습니다 것이기 때문에이 덜 구체적으로 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.