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


답변:


41

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

5
+1 예제는 특히 여기에 설명되어 있습니다.
Tashus

2
별칭의 경우 builtin cd mysubdir와 사이에 차이가 \cd mysubdir있습니까?
gerrit

2
@gerrit이라는 함수가있는 경우에만 cd,이 경우는의 \cd별칭 우회 것 및 기능을 실행합니다.
22:08의

15

대부분의 경우 차이가 없습니다 (그러나 아래 참조). 이 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것입니다 ( "특별 내장 유틸리티"중 하나가 아님). . 또한 작업 디렉토리를 주어진 디렉토리로 변경할 수 있는지 여부를 테스트하는 역할을 합니다 .


그러나 MacOS는 외부 cd명령 으로 OS 범주에 속합니다 .
yoann

@yoann 사실이다.
Kusalananda

고마워요-당신은 최고의 노치, 잘 연구되고, 노련한 pedantry로 하루를 보냈습니다.
james

대부분의 쉘-그것은 execlineb를위한 외부 프로그램이지만, 그러면 cd 는 나머지 인수를
실행할 것입니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.