Gok*_*tug 18 shell bash cd-command
我遇到了一个 Linux 命令,builtin cd.
命令builtin cd和之间有什么区别cd?
事实上,我对差异做了一些研究,但我找不到对此的显着和重要的解释。
fil*_*den 43
该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
Run Code Online (Sandbox Code Playgroud)
或者使用别名:
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
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
Kus*_*nda 15
在大多数情况下,没有区别(但见下文)。该cd命令是所有 shell 中的内置命令。需要内置1作为外部命令不能改变调用shell的环境,改变工作目录就构成其环境的改变。
该bash命令builtin强制 shell 使用命令的内置版本,即使可能有可用的 shell 函数、别名或外部命令具有相同的名称。
在存在的情况下进行,例如一个shell函数的名称cd,那么builtin cd就不会调用。 使用可以builtin cd绕过用户通过 shell 函数或别名添加的任何重载功能。
例子:
在cd内置的命令可以通过更新提示功能被重载:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
Run Code Online (Sandbox Code Playgroud)
哪里__update_prompt是其他一些用户提供的输出字符串的函数。
该builtin cd函数中不会递归调用该函数。builtin cd在此函数处于活动状态的 shell 中使用,也不会调用该函数。
1有带有外部cd命令的Unices (macOS,我相信还有 Solaris)。该命令无法更改 shell 的工作目录,其目的可能是为了满足 POSIX 标准,该标准cd列为应该可用的外部实用程序cd之一(不是“特殊内置实用程序”之一) . 它也可以作为一个测试,看看是否改变工作目录到指定的目录将是可能的。