Bash内置的"history"可以执行,但不在$PATH中

Bash built-in "history" can be executed, but is not in $PATH

我知道 shell 内置函数已加载到内存中,我认为我可以在 /usr/bin 或 echo $PATH 中的某个地方找到所有内置函数。我试图找出 history 命令的工作原理。我的假设是它正在读取 ~/bash_history。所以我尝试了 objdump -S $(which history)

which history
echo $?

1

这不是 return 命令的路径,它让我知道历史二进制文件所在的位置。

type -t which
builtin

我假设这意味着它已加载到内存中。 shell 进程加载存储在 echo $PATH

之外的内置函数也是如此

shell 内置函数实际上是内置在 shell 可执行文件本身中。它由 shell 调用,不是作为单独的进程,而只是作为 shell 进程中的常规函数​​调用。所以如果你想找到它的源代码,你需要在source code of bash.

中查找

对于许多内置函数,例如cd,它成为内置函数的主要原因是它修改了shell本身的状态。让 cd 成为一个单独的进程是没有意义的,因为该进程只会更改它自己的当前目录,而不是 shell 进程的当前目录。在 history 的情况下,原因大概是 ~/.bash_history 仅在 shell 退出时写入,因此该命令还需要访问当前会话的内存历史记录,这包含在 运行 bash 进程中。对于其他内置函数,例如 echo,原因在于性能:假设该命令被频繁使用,我们希望避免每次调用它时都产生一个新进程(但如果你真的想要一个进程,还有 /bin/echo,它们的行为可能有所不同。