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
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
命令是内置的,因此通常builtin cd
会执行与cd
. 但是如果cd
被重新定义为函数或别名则有所不同,在这种情况下cd
将调用函数/别名但builtin cd
仍会更改目录(换句话说,即使被函数破坏,也会保持内置可访问性。)例如:
或使用别名:
using
builtin
也是定义cd
执行某些操作并更改目录的函数的好方法(因为cd
从它调用只会在无休止的递归中再次调用该函数。)例如:
在大多数情况下,没有区别(但见下文)。该
cd
命令是所有 shell 中的内置命令。需要内置1作为外部命令不能改变调用shell的环境,改变工作目录就构成了其环境的改变。该
bash
命令builtin
强制 shell 使用命令的内置版本,即使可能存在同名的 shell 函数、别名或外部命令。如果有一个名为 的shell 函数
cd
,则builtin cd
不会调用它 。使用builtin cd
绕过用户可能通过 shell 函数或别名添加的任何重载功能。例子:
更新提示的
cd
函数可能会重载内置命令:哪里
__update_prompt
是其他一些用户提供的输出字符串的函数。函数中的
builtin cd
不会递归调用函数。在此函数处于活动状态的 shell 中使用builtin cd
,也不会调用该函数。1有带有外部
cd
命令的 Unices(macOS,我相信还有 Solaris)。该命令的目的,它不能更改外壳的工作目录,可能是为了满足 POSIX 标准,该标准cd
列为应该可用的外部实用程序之一(cd
不是“特殊内置实用程序”之一) . 它还可以作为测试,看看是否可以将工作目录更改为给定目录。