我有.bash_profile设置来导出到历史文件:
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')
然后我将导出历史记录命令的时间戳。
export HISTTIMEFORMAT="%Y/%m/%d %T "
这种组合导致epoch时间戳被写入历史文件:
#1463962023
top
因此,我在perl中向.bash_profile中写入了一行代码,只在文件中写入人类可读的时间戳,从而消除了epoch行:(和其他几行)
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个命令,然后运行history命令,一切看起来都很正常。但是,一旦注销并重新登录并运行历史记录命令,就会显示错误的行。
更新:我已经将问题缩小到以下行:
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
当我注释掉这一行时,history命令按预期工作。但是,这也是在历史文件上运行格式化的命令。我试着把"历史-a"部分从台词中去掉,剩下的就留下来,但这并没有什么区别。如果我把整行注释掉,我怎么能使用perl脚本调用文件的格式呢?
我(不久前)创建了一个类似的函数,它可以满足您的需求,我想:
# export detailed history
exphtd () { HISTTIMEFORMAT='%F %T ' history | grep -v "^#" > /root/history/.bash_hist ; }
然后使用:
$ exphtd
输出:
455 2016-05-20 15:12:46 cd ~