我不知道这是否符合预期,但我的历史记录不会跨会话保存。也就是说,如果我关闭窗口,那么当我再次打开它时,历史记录是空的。我该如何在会话之间保留它?
以下是您所请求的命令的输出:
set -o | grep history
history on
$ grep -i history ~/.bashrc ~/.bash_profile ~/etc/bash.bashrc ~/etc/profile ~/.profile
/cygdrive/c/cygwin/home/car/.bashrc:# Make bash append rather than overwrite the history on disk
/cygdrive/c/cygwin/home/car/.bashrc:# History Options
/cygdrive/c/cygwin/home/car/.bashrc:# Don't put duplicate lines in the history.
/cygdrive/c/cygwin/home/car/.bashrc:# export PROMPT_COMMAND="history -a"
grep: /cygdrive/c/cygwin/home/car/etc/bash.bashrc: No such file or directory
grep: /cygdrive/c/cygwin/home/car/etc/profile: No such file or directory
/cygdrive/c/cygwin/home/car/.profile:if [ "x$HISTFILE" == "x/.bash_history" ]; then
/cygdrive/c/cygwin/home/car/.profile: HISTFILE=$HOME/.bash_history
$ ls -la ~/ | grep history -> no output
$ echo $HISTFILE
~/.bash_history
$ echo $HISTSIZE
500
$ echo $HISTFILESIZE
500
经过下面的答案中描述的编辑后,我现在得到:
grep -i hist .bashrc
# Make bash append rather than overwrite the history on disk
shopt -s histappend
# History Options
# Don't put duplicate lines in the history.
export HISTCONTROL="ignoredups"
# (added) A new shell gets the history lines from all previous shells
PROMPT_COMMAND='history -a'
# HISTIGNORE is a colon-delimited list of patterns which should be excluded.
我仍然无法保存跨会话的历史记录。我阅读了以下问题:
- 使用 histappend 时 Bash 历史记录丢失
- 如何防止 Bash 改变历史记录?
- 什么决定了 bash 历史命令中显示的内容?
- 如何在会话间保留我的 bash 历史记录?
- 定期保存 bash 历史记录
似乎没有人能解决我的问题,包括下面的那个从所谓的重复中得到答案的人的回答。
答案1
好的,我发现了问题所在。我无法关闭窗口,我必须输入“exit”才能正常关闭。
答案2
嗯,看起来你的~/.bashrc
没有必要的选项。请确保这些行在你的~/.bashrc
:
# Make Bash append rather than overwrite the history on disk:
shopt -s histappend
# A new shell gets the history lines from all previous shells
PROMPT_COMMAND='history -a'
# Don't put duplicate lines in the history.
export HISTCONTROL=ignoredups
答案3
我强烈建议您在 bash 配置中使用此设置。它将每个命令保存到名为当前日期的文件中,即 ~/.logs 目录中的 bash-history-2020-10-29.log。
# Saving history to file
export PROMPT_COMMAND='if [ "$(id -u)" -ne 0 ]; then echo "$(date "+%Y-%m-%d.%H:%M:%S") $(pwd) $(history 1)" >> ~/.logs/bash-history-$(date "+%Y-%m-%d").log; fi'
export HISTSIZE=100000
export HISTTIMEFORMAT="%d/%m/%y %T "
# Avoid duplicates
export HISTCONTROL=ignoredups:erasedups
# When the shell exits, append to the history file instead of overwriting it
#shopt -s histappend
# After each command, append to the history file and reread it
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
然后使用这个 bash 函数可以查询以前使用过的 shell 输入并按日期排序。
alias s='search'
search() {
ls -rt ~/.logs/*.log | xargs grep -rnw "$1"
}
答案4
如果你想要一个更完整的解决方案,可以在本地保留你的 bash 历史记录,存储其他上下文(cwd、运行时、退出代码等)并将其同步到你的其他计算机,请参阅历史。我对这个问题感到很沮丧,并构建了它,希望能够让 shell 历史记录更好地工作。它的工作原理是将 shell 历史记录的单独副本存储在 SQLite DB 中,这样 bash 历史记录处理的许多怪癖就不会意外删除它。