附加到history命令的.bash_profile中历史文件的perl脚本

时间:2016-05-23 00:26:38

标签: bash perl

我有.bash_profile设置导出到历史文件:

export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')

然后我将导出历史命令的时间戳。

export HISTTIMEFORMAT="%Y/%m/%d %T "

此组合导致将纪元时间戳写入历史文件:

#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

如何在不导致history命令报告这些不需要的行的情况下,按照我的意愿写入文件?

注意 - 这个带有历史命令的异常似乎是"激活"当我登录系统时。 (我使用ssh)我可以在会话中,运行10个命令,然后运行历史命令,所有看起来都正常。但是,只要注销并重新登录并运行历史命令,它就会显示错误的行。

更新:我已将问题缩小到该行:

PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"

当我注释掉这一行时,history命令按预期工作。但是,这也是在历史文件上运行格式的命令。我试图删除"历史-a"部分来自线路,留下其余部分,但这没有任何区别。如果我要将整行注释掉,我怎样才能使用perl脚本调用文件格式?

1 个答案:

答案 0 :(得分:2)

我创建了一个类似的功能(前一段时间),它可以实现我想要的功能:

# export detailed history
exphtd () { HISTTIMEFORMAT='%F %T ' history | grep -v "^#" > /root/history/.bash_hist ; }

然后使用:

$ exphtd

<强>输出:

455  2016-05-20 15:12:46 cd ~