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

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

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

在这里澄清一下 shell:假设您已经登录到非 Gui Linux 系统,并且$壳牌不是设置为 Bash,而是设置为 Dash 或任何类似 Bourne 的 shell。

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

描述符的评论这个帖子让我思考也许这更多地与需要了解中的键绑定有关而不是实际上像贝壳之间的差异之类的东西。

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

答案1

并非所有 shell 都支持历史记录。如果使用 libedit 支持进行编译dash,则通过命令提供有限的历史记录支持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 的制表符补全、箭头键处理和历史记录。

答案2

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

答案3

它很难看,但我在只有 sh 可用的旧系统(如 ESXi 主机)上使用它:

cat `printf %s $HISTFILE`

答案4

我找到了清除历史文件的解决方案,无需输入历史命令 Find .(shell/package name)_history 文件路径(通常在主目录中)并在某处创建空文件,然后使用 cat path/to/history file < path/to/empty file之后它会清除历史记录,您可以使用此脚本创建 name.sh 文件

相关内容