如何在会话中保留我的bash历史记录?


24

我正在研究运行fedora 9的x86目标。

每当我重新启动它时,我的历史记录都会恢复到某种状态,而且我没有在重启之前在会话中执行的命令。

我需要更改以更新重启前的历史记录?


他问的是“如何在会话中保留我的bash历史记录?”,这与shell编程有关。重启是一种失去shell的戏剧性方式,就是这样。它不需要关闭主题。
Jonathan Leffler

好点 - 这可能应该转移到SuperUser。
B.R.

@Jonathan是的,你的问题是正确的。我不确定究竟要问什么。

在执行后立即保存每个命令,而不是在会话结束时也会有所帮助。这是因为如果你同时运行两个会话,那么如果没有下面这一行,bash将在会话结束时保存历史记录(比如说)。如果session-1正在运行并且您想立即访问session-2中的session-1的历史记录,那么除非将以下行添加到.bashrc文件中,否则您将无法访问。 PROMPT_COMMAND ='历史-a'
Abhinav

Answers:


13

哪个历史? bash的历史?如果您丢失了bash历史记录并且一次有多个会话,那是因为每个会话都会覆盖其他会话的历史记录。

你可能想告诉bash不要每次都覆盖历史记录,而是要附加到它上面。您可以通过修改.bashrc来运行 shopt -s histappend

您还可以通过将HISTSIZE导出为大数字来增加历史文件的大小(以字节为单位,因此100000应该足够多)。


7
HISTSIZE 是要记住的命令数,而不是字节数。
Chris Down

8

我遇到了同样的问题 - 但我的 .bashrc 文件已经有了 shopt -s histappend 并纠正 HISTFILEHISTSIZEHISTFILESIZE

对我来说问题是我的 .bash_history 文件归 而不是我的用户名,所以我的用户永远不会在退出时保存到该文件。


3
我刚刚发现我与root拥有的.bash_history存在完全相同的问题。我希望在失去所有可爱的历史之前我已经意识到了,但是没关系:-)
SamStephens

同样在这里 - 结束了几天的徘徊:)谢谢!
davka

1
sudo chmod your_user_name .bash_history 做到了!谢谢。
wij

sudo chown user_name:user_name ~.bash_history 解决了!
alper


2

我编写了一个脚本,用于根据以下内容为每个会话或任务设置历史文件。

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

它没有必要保存每个历史命令,但它保存了我关心的那些,并且更容易检索它们然后通过每个命令。我的版本还列出了所有历史文件,并提供了搜索所有历史文件的功能。

完整来源: https://github.com/simotek/scripts-config/blob/master/hiset.sh


1

我在.bashrc中写了一些行来完成以下操作: 将每个命令后的每个会话保存到文件中。您将创建与终端一样多的历史文件。从最近的历史文件开始启动新终端时,将先前会话中的所有历史文件加载到历史缓冲区,直到达到行计数阈值。

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done

0

我会确保.bash_history存在。如果没有,那么bash无法保存命令历史记录。

如果.bash_history不存在,请通过运行touch创建它:

touch ~/.bash_history

这只会在您的主目录中创建空的.bash_history文件,这将填满您的命令,并且应该在会话之间保留。


-1

3
欢迎来到SuperUser!请在答案中包含足够的信息,提示者无需点击外部链接。此外,请确保您的答案不会简单地复制现有的答案(从快速浏览该链接,它似乎正在做)。
Indrek

//,看起来像一篇好文章。但我认为stackexchange试图独立于链接目的地,至少有一点点。介意添加一点解释?
Nathan Basanese
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.