![时间戳历史文件导致历史命令中出现错误行](https://linux22.com/image/88908/%E6%97%B6%E9%97%B4%E6%88%B3%E5%8E%86%E5%8F%B2%E6%96%87%E4%BB%B6%E5%AF%BC%E8%87%B4%E5%8E%86%E5%8F%B2%E5%91%BD%E4%BB%A4%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E8%A1%8C.png)
我有 .bash_profile 设置可以导出到历史文件:
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')
然后我导出历史命令的时间戳。
export HISTTIMEFORMAT="%Y/%m/%d %T "
这种组合导致纪元时间戳被写入历史文件:
#1463962023
top
因此,我在 .bash_profile 中写入了 perl one liner,仅将人类可读的时间戳写入文件中,从而消除了纪元行:(以及其他几行)
format_history () {
local file=/root/history/.bash_hist-$(who -m | awk '{print $1}')
perl -i -pe 's/^#(\d{10})$/"# ".localtime($1)/e' "$file"
}
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
现在我导出的文件如下所示:
# Sun May 22 19:06:41 2016
last
这太棒了,正是我想要的。但是,这会产生不必要的副作用,即在历史命令中附加专用行,其中只包含不需要的日期。
824 2016/05/22 19:07:33 # Sun May 22 19:06:41 2016
825 2016/05/22 19:07:33 last
如何像我想要的那样写入文件而不导致历史命令报告这些不需要的行?
注意 - 当我登录到系统时,历史命令的这种异常似乎被“激活”。 (我使用 ssh)我可以在会话中运行 10 个命令,然后运行历史命令,一切看起来都很正常。但是,一旦注销并重新登录并运行历史命令,它将显示错误行。
更新:我已将问题范围缩小到以下行:
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
当我注释掉这一行时,历史命令将按预期工作。然而,这也是对历史文件进行格式化的命令。我试图从行中删除“history -a”部分,留下其余部分,但这没有任何区别。如果我将整行注释掉,我如何使用 perl 脚本调用文件的格式?
答案1
我会保留历史文件并在prompt_command 处理程序中实现命令记录。我还会将其写入私有日志文件,这样就不会与历史文件的其他用法发生冲突,也不会与其他用户访问 /root 发生问题