在我的中.bashrc
我已经添加了:
# https://stackoverflow.com/a/40158199/9881330
function rescue_history {
history -a
}
trap rescue_history SIGHUP
然而,这不起作用,因为之后client_loop: send disconnect: Connection reset by peer
历史记录仍然丢失。这非常烦人,因为输入的有用命令全部丢失了!
核心问题:如何配置.bashrc
在ssh连接被peer重置时保存历史记录?
非常困惑的是,默认情况下不启用这种“历史记录保存”行为。
我的.bashrc
也有这个(如果有帮助的话):
# new history settings
# http://jesrui.sdf-eu.org/remember-all-your-bash-history-forever.html
HISTTIMEFORMAT='%F %T '
HISTFILESIZE=-1
HISTSIZE=-1
HISTCONTROL=ignoredups
#HISTIGNORE=?:?? # lines with one or two characters are discarded from the history (e.g. ls commands)
shopt -s histappend # append to history, don't overwrite it
# attempt to save all lines of a multiple-line command in the same history entry
shopt -s cmdhist
# save multi-line commands to the history with embedded newlines
shopt -s lithist
答案1
您可以使用特殊变量在每次输入命令时PROMPT_COMMAND
运行。history -a
PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND/%;};}history -a"
这将混合来自并发会话的命令,这可能会导致令人困惑的回滚。
为了克服这个问题,这里有一个稍微复杂的版本,它应该在每个会话的主目录中创建一个时间、tty 和 pid 标记文件。
SESSION_HISTORY_FILE="${HOME}/bash_history_$(date -d "$(ps -olstart= -p$$ | awk '{print $2,$3,$5,$4}')" +%F_%H-%M-%S)$(tty | tr / _)_$$"
PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND/%;};}history -a '${SESSION_HISTORY_FILE}'"
这里的想法是创建发出的命令的正确上下文记录。
对于终止的会话,您不会在向后滚动中看到这些(除非您添加了;history -a
)。