如何保留 bash 历史记录?

如何保留 bash 历史记录?

我不知道这是否符合预期,但我的历史记录不会跨会话保存。也就是说,如果我关闭窗口,那么当我再次打开它时,历史记录是空的。我该如何在会话之间保留它?

以下是您所请求的命令的输出:

 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.

我仍然无法保存跨会话的历史记录。我阅读了以下问题:

似乎没有人能解决我的问题,包括下面的那个从所谓的重复中得到答案的人的回答。

答案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 历史记录处理的许多怪癖就不会意外删除它。

相关内容