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

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

我遇到了一个Linux命令,builtin cd.

命令builtin cd和之间有什么区别cd

事实上,我对这种差异做了一些研究,但我找不到对此的显着且有意义的解释。

答案1

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

答案2

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

bash命令builtin强制 shell 使用命令的内置版本,即使可能存在同名的 shell 函数、别名或外部命令。

在有的情况下例如,一个名为 的 shell 函数cd,那么builtin cd不是就这么称呼吧。 使用builtin cd会绕过用户可能通过 shell 函数或别名添加的任何重载功能。

例子:

内置命令cd可能会被更新提示的函数重载:

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

其中__update_prompt是一些其他用户提供的输出字符串的函数。

函数中的builtin cd不会递归调用该函数。在该函数处于活动状态的 shell 中使用builtin cd,也不会调用该函数。


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

相关内容