如何自动定期运行history -a命令?

如何自动定期运行history -a命令?

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 -ainPROMPT_COMMAND来代替:

PROMPT_COMMAND+="${PROMPT_COMMAND:+;}history -a"

或者

PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}history -a"

(如果变量已经具有非空值,则这些附加history -a到 的值PROMPT_COMMAND并用 分隔它。);

这将在显示下一个提示之前保存历史记录。在每次提示时执行此操作可能不会导致性能出现任何明显下降。

相关内容