cd和cd内置命令之间有什么区别?


Answers:


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此处的示例特别说明。
塔苏斯

2
如果是别名,则builtin cd mysubdir和之间有什么区别\cd mysubdir
Gerrit

2
@gerrit仅当有一个名为的函数时cd,在这种情况下\cd将绕过别名并运行该函数。参见stackoverflow.com/a/16506263/4518341
wjandrea

15

在大多数情况下,没有区别(但请参见下文)。该cd命令是所有shell中的内置命令。它需要是内置的1,因为外部命令不能更改调用shell的环境,而更改工作目录构成了其环境的更改。

bash命令builtin部队外壳使用内置的命令的版本,即使有可能是一个shell函数,别名或外部命令可以用同一个名字。

在存在的情况下进行,例如一个shell函数的名称cd,那么builtin cd不会调用。 使用builtin cd绕过用户可能已通过Shell函数或别名添加的任何重载功能。

例:

cd内置的命令可以通过更新提示功能被重载:

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

__update_prompt用户提供的其他函数在哪里输出字符串。

builtin cd函数中不会递归调用该函数。builtin cd在此函数处于活动状态的外壳中使用,将不会再调用该函数。


1有些Unices带有外部cd命令(macOS,我相信是Solaris)。该命令的目的是不能更改Shell的工作目录,可能是为了满足POSIX标准,该标准被cd列为应该可用的外部实用程序cd之一(不是“特殊的内置实用程序”之一) 。它也可以作为一个测试,看看是否改变工作目录到指定的目录将是可能的


FWIW,通过外部cd命令,MacOS也将属于OS类别。
yoann '19

@yoann确实如此。
库萨兰达

谢谢您-您通过一流的,经过充分研究的,有脚注的脚手架成就了我的一天。
james

大多数 shell –这是execlineb的外部程序,但是它的cd然后将执行其剩余参数
Grump
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.