[unix] 내장 cd와 cd 명령의 차이점은 무엇입니까?

나는 리눅스 명령을 만났다 builtin cd.

명령 builtin cd과 의 차이점은 무엇입니까 cd?

사실, 그 차이점에 대해 조사했지만, 이것에 대해 놀랍고도 중요한 설명을 찾을 수 없었습니다.



답변

cd명령은 내장되어 있으므로 일반적으로 builtin cd와 동일한 작업을 수행합니다 cd. 그러나 cd함수 또는 별칭으로 재정의 되면 차이가 있습니다. 이 경우 cd함수 / 별칭을 호출하지만 builtin cd여전히 디렉토리를 변경합니다 (즉, 함수에 의해 클로버 된 경우에도 내장 액세스 가능 상태를 유지함).

예를 들면 다음과 같습니다.

user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd  # undefine function

또는 별명으로 :

user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd  # undefine alias

사용 builtin은 또한 cd무언가를 수행 하고 디렉토리를 변경 하는 함수 를 정의하는 좋은 방법 cd입니다.

예를 들면 다음과 같습니다.

user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd  # undefine function


답변

대부분의 경우 차이가 없습니다 (그러나 아래 참조). 이 cd명령은 모든 쉘에 내장 된 명령입니다. 외부 명령이 호출 쉘의 환경을 변경할 수 없으므로 작업 디렉토리를 변경하면 환경이 변경 되므로 내장 1 이어야 합니다.

bash명령 builtin힘은 쉘이 사용하는 내장 명령의 버전, 같은 이름을 사용할 수 쉘 기능, 별명, 또는 외부 명령이있을 수있다하더라도.

이 경우 됩니다 이름으로 쉘 기능을 예 cd, 다음 builtin cd없는 저를 호출합니다. 사용 builtin cd하면 사용자가 셸 함수 또는 별칭을 통해 추가 한 오버로드 된 기능을 무시합니다.

예:

cd내장 명령 프롬프트를 업데이트하는 기능에 의해 오버로드 할 수있다 :

cd() {
    builtin cd "$@" && PS1=$(__update_prompt)
}

여기서 __update_prompt문자열을 출력하는 다른 사용자 제공 함수가 있습니다.

builtin cd함수의 재귀 적 함수를 호출하지 않을 것입니다. builtin cd이 함수가 활성화 된 쉘에서 사용하면 추가로 함수를 호출하지 않습니다.


1 외부 cd명령 (macOS, 그리고 나는 솔라리스)을 가진 Unices가 있습니다 . 쉘의 작업 디렉토리를 변경할 수없는 이 명령의 목적 은 사용 가능한 cd외부 유틸리티 중 하나로 나열되는 POSIX 표준을 만족시키는 cd것입니다 ( “특별 내장 유틸리티”중 하나가 아님). . 또한 작업 디렉토리를 주어진 디렉토리로 변경할 수 있는지 여부를 테스트하는 역할을 합니다 .


답변