我这里有一个奇怪的。我正在编写一个需要访问 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
,采用常规格式并具有正确的时间戳,这正是我期望发生的情况。
我想我想知道:
- 为什么这两个命令的输出在 MacOS 中不同,但在 Linux 中却相同?
- 如何从命令字符串获得正确的输出? (我正在从 Python 脚本运行命令)
- 我是否以错误的方式处理这件事?我最初的目标是从 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+)。