history -a
我正在使用 bash shell,偶尔手动执行一次命令。我的典型 shell 会话会持续数周甚至数月,而且我很少退出 shell 会话。因此,我history -a
偶尔会强制将当前会话历史记录写入 bash_history 。我正在考虑编写一个自动化脚本history -a
每天定期执行一次。实现这一目标的最佳方法是什么?
答案1
如果您ENTER每天至少按一次键,那么基于 PROMPT_COMMAND 的解决方案可能适合您:
save_history_daily () {
# if the current time is more than a day's-worth of seconds newer than
# the modification time of $HISTFILE, then run 'history -a'
if (( $(printf '%(%s)T' -1) - 86400 > $(stat -c %Y "$HISTFILE") ))
then
history -a
fi
}
PROMPT_COMMAND="$PROMPT_COMMAND
save_history_daily"
这依赖于 bash 版本 bash-4.2-alpha 或更高版本的功能printf %(...)T
;在这里,我使用-1
它的参数来检索当前时间(自纪元以来的秒数)。如果您有较旧的 bash 版本,您可以通过调用date
:来替换该位$(date +%s)
。从 bash-5.0-alpha 开始的 Bash 版本具有可用的 EPOCHSECONDS 变量,这会稍微更有效。
我复制了嵌入换行符 PROMPT_COMMAND 分配的想法吉尔斯的答案之一;它将新函数调用附加到已定义的任何现有值。
答案2
首先,history
它是 Bash 内置命令,它会影响它运行的会话。据我所知,您无法从另一个会话运行历史命令来保存尚未保存的最近命令。
一种解决方案可能是修改环境变量以在每个命令条目中PROMPT_COMMAND
运行。history -a
这个帖子可能会帮助你。
答案3
您无法从脚本保存 shell 历史记录。反正也不直接。
这是一个基本上未经测试的想法。
无论是作为交互式 shell 还是作为非交互式 shell,shellbash
都会忽略该信号。QUIT
这意味着可以安装陷阱来捕获QUIT
信号。这可以通过交互式 shell 会话的 shell 启动文件(即~/.bashrc
.陷阱会简单地调用history -a
:
trap 'history -a' QUIT
然后可以将该QUIT
信号发送到 shell 会话以使其保存其历史记录。使用pkill
,您甚至可以将其发送到全部 bash
您当前运行的会话:
pkill -QUIT -U "$LOGNAME" bash
这可以通过 cron 作业来完成。
请注意,除了看看它之外,我实际上还没有对它进行任何程度的测试出现正在工作。唯一的问题是^\
shell 中的提示符会以这种方式发出信号。我也只是假设如果许多炮弹保存它们的历史同时,那么这是以智能方式完成的,以避免混合写入。
就我个人而言,我可能会选择使用history -a
inPROMPT_COMMAND
来代替:
PROMPT_COMMAND+="${PROMPT_COMMAND:+;}history -a"
或者
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}history -a"
(如果变量已经具有非空值,则这些附加history -a
到 的值PROMPT_COMMAND
并用 分隔它。);
这将在显示下一个提示之前保存历史记录。在每次提示时执行此操作可能不会导致性能出现任何明显下降。