如何以编程方式向 Bash 历史记录添加条目并使时间戳正常工作?

Den*_*son 5 bash command-history

在 CentOS 6.2 和 Bash 4.1.2(1) 上,我添加了一个文件,/etc/profile.d其中包含:

HISTTIMEFORMAT='%c : '
history -s "# some text as a marker"
Run Code Online (Sandbox Code Playgroud)

只要变量被设置并且标记被写入用户的历史列表(以及~/.bash_history他们的时间exit),这就会起作用。

问题是:

  • history -s 添加标记时不添加时间戳
  • 回滚历史记录在标记处停止(~/.bash_history文件未读入内存)
  • 标记评论的历史条目有“??” 而不是(缺失的)时间戳

我尝试添加:

history -s "#$(date +%s)"
Run Code Online (Sandbox Code Playgroud)

在另一个history -s命令之前,但 Bash 将其视为历史命令而不是时间戳,即使它的格式相同。

另一种选择是将标记和时间戳直接附加到~/.bash_history,但是当它稍后被附加时,它们与会话历史记录中的活动不相邻。由于其他用户或单个用户的多个会话,可能会有其他会话附加在标记及其相关会话之间。

有没有办法解决这些问题?

更新:

我已经尝试添加set -o history(并删除该history -s "#$(date +%s)"行)并且它似乎解决了上面提到的历史滚动问题,但是缺少时间戳仍然是一个问题。

Den*_*son 2

我在help-bash 邮件列表上发布了这个问题,并得到了Bash维护者 Chet Ramey 的回复。

他建议在命令之前添加以下任一内容history -s

set -H    # aka set -o histexpand
Run Code Online (Sandbox Code Playgroud)

或者

histchars='!^#'
Run Code Online (Sandbox Code Playgroud)

我尝试了它们,它们都有效。原因是#在配置文件代码运行时尚未设置默认的历史注释字符,因此为 null ( \0)。

这是我的工作文件:

HISTTIMEFORMAT='%c : '
histchars='!^#'
set -o history
history -s "# some text as a marker"
Run Code Online (Sandbox Code Playgroud)