如何访问 sh 中的历史缓冲区?(不在 Bash 中)

for*_*ord 6 command-line shell command-history dash posix

sh 中是否有命令历史记录,例如如何访问它,以及如何确保它清晰?

在此澄清 shell:假设您已登录到非 Gui Linux 系统,并且$SHELL未设置为 Bash,而是设置为 Dash 或任何类似 Bourne 的 shell。

手册页提到了一个“历史”命令,我在一些 BSD 系统中看到过,但这实际上不在我的 shell 中,而且我无法在随后的 sh 手册和信息页中轻松找到答案。

descriptor 在这篇文章中的评论让我想到,也许更多的是需要了解sh 中的键绑定,而不是实际上类似于 shell 之间的差异。

对于未来的读者,这里有一篇关于 shell 历史的好文章

Sco*_*der 5

并非所有 shell 都支持历史记录。dash如果使用 libedit 支持进行编译,则通过命令提供有限的历史记录支持fc,但否则不支持。dash无法保存历史文件。

通常,如果 shell 不支持向上箭头键,您可以假设它也不会保存历史文件。这不是一条硬性规定,但在我遇到的每一个案例中都是如此。

其他一些 shell(bash尤其是其他 shell)使用 readline,它通常将历史记录作为~/.*_history文件保存在主目录下,并*替换为程序名称。例如,Python 3 使用 readline,并将其历史记录存储在~/.python_history.

根据 shell 的不同,保存位置可能是可配置的,也可能是不可配置的。bashzsh使用HISTFILE(全部大写)变量。如果你的 shell 配置正确,这不应该是一个环境变量,所以如果你在 中看到它,你就犯了一个错误(但它仍然应该显示在或 的env输出中)。setprintf %s\\n "$HISTFILE"

如果程序不支持历史记录(例如,ed使用 的 shell 脚本read或旧版本的mysql),则会有一个名为 的跨平台应用程序,rlwrap它将使用 readline 为其提供类似 bash 的 Tab 补全、箭头键处理和历史记录。


Mel*_*lan 4

除非显式设置,否则没有默认的 shell 历史记录。要验证您是否拥有它,env|grep -i hist可以执行该命令,如果您看到诸如等的变量histfile(可能是大写的),则意味着您的 shell 历史记录已启用,您应该看到历史文件所在的位置。要清除,除了删除文件之外,您可以使用任何合适的方法