【问题标题】:Bash built-in "history" can be executed, but is not in $PATHBash 内置的“历史”可以执行,但不在 $PATH 中
【发布时间】:2020-02-21 22:05:47
【问题描述】:

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

which history
echo $?

1

这没有返回命令的路径,这使我知道历史二进制文件所在的位置。

type -t which
builtin

我认为这意味着它已加载到内存中。 shell 进程也会加载存储在echo $PATH 之外的内置函数

【问题讨论】:

  • 如果 which 是内置的,那么你的 shell 不是 bash。你真的在运行 zsh 吗?
  • 如果您已经了解type,为什么不运行type history? :)
  • ...但是,是的,history 必须 是一个内置的 - 它如何支持诸如将 shell 的内存中历史记录刷新到磁盘而不是 shell 进程的一部分,因此可以访问该历史记录?
  • 感谢您指出这一点。我当时正在使用 bash。在这里复制了错误的命令。虽然我换了几次贝壳。只是想知道,shell日志文件是否存储在主目录中?
  • 如果你指的是历史文件,有一个 HISTFILE 变量控制它的存储位置(在 bash 中);默认为~/.bash_history。文件的位置和格式没有全球/通用标准。

标签: linux bash sys


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2020-02-22
    • 2017-01-06
    • 2010-12-19
    • 2013-11-29
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多