`cd` 在哪里?

spu*_*der 40 shell fhs bash cd-command

在 bash 子 shell 中,运行 cd 时出现以下错误

sudo: cd: command not found
Run Code Online (Sandbox Code Playgroud)

这是意料之中的,因为我没有路径。通常要解决这个问题,我只提供完整路径,如下所示:(/usr/local/bin/foo)

令我惊讶的是,cd它似乎不在任何正常的地方。

which cd
whereis cd
ls /bin | grep cd
Run Code Online (Sandbox Code Playgroud)

相比之下,ls正是我所期望的。

which ls
/bin/ls
Run Code Online (Sandbox Code Playgroud)

cd命令位于何处?为什么与所有其他命令不同?

更新

另一个有趣的花絮,cd 没有出现在 hash

hash
0   /bin/ls
2   /usr/bin/find
2   /sbin/ip
1   /usr/bin/updatedb
1   /usr/bin/apt-get
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 51

我用的是什么光盘?

如果你在 Bashcd是一个内置的。type 命令甚至证明了这一点:

$ type -a cd
cd is a shell builtin
cd is /usr/bin/cd
cd is /bin/cd
Run Code Online (Sandbox Code Playgroud)

系统将使用此列表中的第一项,因此内置选项将是首选选项,并且是唯一有效的选项(请参阅下面关于什么是 /bin/cd 的部分))。

什么是内建?

我喜欢将内置函数视为 Bash 知道如何自己做的函数。基本上,您经常使用的任何东西都已移入 Bash“内核”,这样它就不必每次都执行一个进程。

您始终可以使用如下builtin命令明确告诉 Bash 您想要一个内置函数:

$ builtin cd
Run Code Online (Sandbox Code Playgroud)

请参阅有关以下内容的帮助builtin

$ help builtin
Run Code Online (Sandbox Code Playgroud)

为什么 cd 不在哈希中?

散列仅用于“散列”(又名“保存”在键/值对中)文件的位置,而不是用于内置函数或关键字。的主要任务hash是省去$PATH每次查找常用可执行文件的过程。

关键词?

这些命令通常是 Bash 编程语言功能的一部分。

$ type while
while is a shell keyword
$ type for
for is a shell keyword
$ type !
! is a shell keyword
Run Code Online (Sandbox Code Playgroud)

有些事情以多种方式实现,例如[

$ type -a [
[ is a shell builtin
[ is /usr/bin/[
[ is /bin/[    
Run Code Online (Sandbox Code Playgroud)

......cd正如你所发现的。

什么是/bin/cd?

在我的 Fedora 19 系统/bin/cd上实际上是一个 shell 脚本:

$ more /bin/cd
#!/bin/sh
builtin cd "$@"
Run Code Online (Sandbox Code Playgroud)

但它并不像你想的那样。有关更多详细信息,请参阅这些其他 U&L 问答:

底线:

POSIX 要求它在那里,在此实现中,它充当测试,确认您能够将目录更改为 X,然后返回一个返回码,确认或否认这是可能的。

  • `/bin/cd` 有什么作用?它肯定不能更改其父进程的工作目录吗? (2认同)

jas*_*yan 17

它是一个内置的。见man bash为的细节cdBash的手册的内置命令的描述:

内置命令包含在 shell 本身中。当内置命令的名称用作简单命令的第一个单词时(请参阅简单命令),shell 会直接执行该命令,而不调用其他程序。内置命令是实现单独实用程序不可能或不方便获得的功能所必需的。