有没有办法将bash中的历史列表的大小设置为超过5000行?

有没有办法将bash中的历史列表的大小设置为超过5000行?

无论我将HISTSIZE环境变量设置为大于 5000 多少,当使用内置打印历史列表时history,它都只打印最后 5000 个命令。我需要它,因为我经常有一个超过 5000 行的大命令.bash_history,有时需要通过按 来处理早期命令Ctrl-R,但如果该命令早于 5000 条命令,我将无法使用该机制访问它。我知道我可以grep在 上使用.bash_history,但我认为该Ctrl-R机制会更快(而且方便)。我使用 gnu bash 版本 4.1。

这是我的 .bashrc 文件的完整内容:

    #!/bin/bash
    # ~/.bashrc: executed by bash(1) for non-login shells.
    # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
    # for examples

    # If not running interactively, don't do anything
    [ -z "$PS1" ] && return

    # don't put duplicate lines in the history. See bash(1) for more options
    # ... or force ignoredups and ignorespace
    #HISTCONTROL=ignoredups:ignorespace:erasedups

    # append to the history file, don't overwrite it
    shopt -s histappend

    # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
    HISTSIZE=50000
    HISTFILESIZE=500000

    # check the window size after each command and, if necessary,
    # update the values of LINES and COLUMNS.
    shopt -s checkwinsize

    # make less more friendly for non-text input files, see lesspipe(1)
    [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

    # set variable identifying the chroot you work in (used in the prompt below)
    if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
        debian_chroot=$(cat /etc/debian_chroot)
    fi

    # set a fancy prompt (non-color, unless we know we "want" color)
    case "$TERM" in
        xterm-color) color_prompt=yes;;
    esac

    # uncomment for a colored prompt, if the terminal has the capability; turned
    # off by default to not distract the user: the focus in a terminal window
    # should be on the output of commands, not on the prompt
    #force_color_prompt=yes

    if [ -n "$force_color_prompt" ]; then
        if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes

        else
        color_prompt=

        fi
    fi

    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\         [\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\@-\u@\h:\w\$ '
    fi
    unset color_prompt force_color_prompt

    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
        ;;
    *)
        ;;
    esac

    # enable color support of ls and also add handy aliases
    if [ -x /usr/bin/dircolors ]; then
        test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval    "$(dircolors -b)"
        alias ls='ls --color=auto'
        #alias dir='dir --color=auto'
        #alias vdir='vdir --color=auto'

        alias grep='grep --color=auto'
        alias fgrep='fgrep --color=auto'
        alias egrep='egrep --color=auto'
    fi

    # some more ls aliases
    alias ll='ls -alF'
    alias la='ls -A'
    alias l='ls -CF'

    # Alias definitions.
    # You may want to put all your additions into a separate file like
    # ~/.bash_aliases, instead of adding them here directly.
    # See /usr/share/doc/bash-doc/examples in the bash-doc package.

    if [ -f ~/.bash_aliases ]; then
        . ~/.bash_aliases
    fi

    # enable programmable completion features (you don't need to enable
    # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
    # sources /etc/bash.bashrc).
    if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
        . /etc/bash_completion
    fi

答案1

这是加载历史记录的实际代码(从bashhist.c第 260 行左右开始):

/* Load the history list from the history file. */
void

load_history ()
{
  char *hf;

  /* Truncate history file for interactive shells which desire it.
     Note that the history file is automatically truncated to the
     size of HISTSIZE if the user does not explicitly set the size
     differently. */
  set_if_not ("HISTSIZE", "500");
  sv_histsize ("HISTSIZE");

  set_if_not ("HISTFILESIZE", get_string_value ("HISTSIZE"));
  sv_histsize ("HISTFILESIZE");

  /* Read the history in HISTFILE into the history list. */
  hf = get_string_value ("HISTFILE");

  if (hf && *hf && file_exists (hf))
    {
      read_history (hf);
      using_history ();
      history_lines_in_file = where_history ();
    }
}

HISTSIZE如果设置了和的值HISTFILESIZE,则将使用它们。

Readline,实际处理输入/行编辑和历史记录的库提供设施来限制历史缓冲区可以增长的大小。然而,Bash 并没有对此设置硬性上限,任何更大的值都会被忽略,至少我能找到。

编辑

评论readline确实是罪魁祸首。我正在(相当愚蠢地)查看功能参数:

有一个名为history-size的变量,可以从inputrc文件中读取。该变量设置历史列表中保存的历史条目的最大数量。我在本地 inputrc 文件中检查了它的值,发现它等于 5000。将其设置为更大的值解决了问题。

答案2

第一次设置 HISTSIZE 时,您的历史记录会被截断,因此如果您之前在 ~/.bashrc 中将其设置为 5000,或者在 /etc 中的系统范围的 bashrc 中,你需要将它们注释掉。

答案3

尝试两个HISTFILESIZEHISTSIZE

答案4

我有同样(或类似)的问题,但 inputrc 很好。就我而言,唯一有效的是注释掉HISTSIZE=1000HISTFILESIZE=2000在我的库存中~/.bashrc- 即使我后来在同一个文件中覆盖了这些变量!

相关内容