附加信息

附加信息

我这里有一个奇怪的。我正在编写一个需要访问 bash 历史记录的程序。我查看了解析.bash_history(或.bash_eternal_history我的配置) 文件,但意识到繁重的工作已经由history内置函数完成了。

我的历史文件的一些内容如下所示。虽然我可以自己解析它,但我更愿意依赖 的history标准化解析器,因为它已经处理边缘情况多行命令、时间戳、histfile 格式,并且可以跨平台工作。

#1587920724
echo test
#1587920725
echo test2
#1587920729
touch file
#1587920731
rm file
#1587920732
history

当输入history命令时,我得到了一个很好的带时间戳的历史列表,如下所示:

 5083  [2020-04-26 18:05:24] echo test
 5084  [2020-04-26 18:05:25] echo test2
 5085  [2020-04-26 18:05:29] touch file
 5086  [2020-04-26 18:05:31] rm file
 5087  [2020-04-26 18:05:32] history

由于history是 shell 内置命令,我需要通过程序中的 bash 命令字符串来运行它。但是,当运行命令时bash -ic 'history -r; history',我会收到以下消息:

10159  [2020-04-26 18:08:35] #1587920724
10160  [2020-04-26 18:08:35] echo test
10161  [2020-04-26 18:08:35] #1587920725
10162  [2020-04-26 18:08:35] echo test2
10163  [2020-04-26 18:08:35] #1587920729
10164  [2020-04-26 18:08:35] touch file
10165  [2020-04-26 18:08:35] #1587920731
10166  [2020-04-26 18:08:35] rm file
10167  [2020-04-26 18:08:35] #1587920732
10168  [2020-04-26 18:08:35] history

注释的时间戳会像命令一样打印出来,并且所有内容都具有相同的时间戳(我运行命令的时间)。

奇怪的是,在 Linux 上,bash -ic 'history -r; history'产生与 完全相同的输出history,采用常规格式并具有正确的时间戳,这正是我期望发生的情况。

我想我想知道:

  1. 为什么这两个命令的输出在 MacOS 中不同,但在 Linux 中却相同?
  2. 如何从命令字符串获得正确的输出? (我正在从 Python 脚本运行命令)
  3. 我是否以错误的方式处理这件事?我最初的目标是从 Python 程序中获取完整的带时间戳的 bash 历史记录(而不需要执行诸如history > history.txt && ./script.py或 之类的外部操作history | ./script.py)。

谢谢 :)

附加信息

  • MacOS 版本:10.14.6 Mojave
  • MacOS bash 版本:3.2.57
  • 历史配置:永恒的狂欢历史
  • Linux版本:Linux Mint 19.2
  • Linux bash 版本:4.4.20

答案1

我可以确认这个问题。

是的,bash 版本 3.2.57 及之前版本似乎存在问题,因为它们无法识别历史文件中的时间戳。我无法在 bash 更改文件中找到具体更改。您可能需要将 bash 升级到较新的版本 (4+)。

相关内容