如何从非交互式 shell 给定的 HISTFILE 路径查看历史记录的输出?

How to view the output of history from a non-interactive shell given path to HISTFILE?

在 emacs 中,我想使用 shell-command-to-string 本质上检索类似 history | tail -n5 的内容。问题是 history 是一个内置的 bash(仅在交互模式下?)所以它不起作用。由于我只对装饰输出的只读快照感兴趣,有没有办法解析历史文件的内容(假设它是 ~/.bash_history)并输出行号和日期作为 history bash 命令呢?

换句话说,有没有办法做这样的事情:

(shell-command-to-string "history --pretty-dump-to-stdout-with-date-time-linenum --filename ~/.bash_history")

? (或者,也许是不同的解决方法?)

使history命令输出一些东西

我预计 set -o history 会失败,因为它将使用历史文件 $HISTFILE,该文件很可能未针对非交互式 shell 设置。假设历史存储在 ~/.bash_history 中,您可以执行 ...

HISTFILE=~/.bash_history; set -o history; history | tail -n5

但是,这会通过添加 history | tail -n5 来修改您的历史记录。更好的方法是在不启用历史记录的情况下读取历史文件:

history -r ~/.bash_history; history | tail -n5

来自您当前会话的命令

假设您在交互式终端会话中并执行...

$ myCommand
$ emacs # and inside emacs the shell command `history` as shown above

... 那么您很可能不会在历史记录中看到 myCommand。这是因为 bash 仅在关闭会话时将历史记录写入历史文件。您可以使用 history -a 手动更新历史文件,因此以下应该有效:

$ myCommand
$ history -a
$ emacs # and inside emacs the shell command `history` as shown above

由于大多数人通常会忘记 history -a,因此最好在您的 .bashrc 中自动执行此步骤,或者在每次提示时 (PROMPT_COMMAND="history -a),或者仅针对 emacs ( emacs() { history -a; command emacs "$@"; }).

漂亮的印刷

is there a way to do something like [...] --pretty-dump-to-stdout-with-date-time-linenum

history命令的历史格式由HISTTIMEFORMAT控制。在 emacs.

中调用 history 之前必须设置和导出格式