bash에서 기록 목록의 크기를 5000줄 이상으로 설정하는 방법이 있습니까?

bash에서 기록 목록의 크기를 5000줄 이상으로 설정하는 방법이 있습니까?

아무리 HISTSIZE환경 변수를 5000 이상으로 설정해도 내장된 인쇄 기록 목록을 사용하면 history마지막 5000개의 명령만 인쇄됩니다. 5000줄이 넘는 큰 명령이 있는 경우가 많고 .bash_history때로는 을 눌러 이전 명령을 처리해야 하기 때문에 이 명령이 필요합니다 Ctrl-R. 그러나 명령이 5000줄보다 오래된 경우 해당 메커니즘을 사용하여 액세스할 수 없습니다. grepon 을 사용할 수 있다는 것을 알고 있지만 이 메커니즘이 더 빠르고 편리할 것이라고 .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.c260번째 ​​줄부터 시작).

/* 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실제로 범인입니다. 나는 함수 매개변수를 (다소 어리석게도) 보고 있습니다.

inputrc 파일에서 읽을 수 있는 History-size라는 변수가 있습니다. 이 변수는 기록 목록에 저장되는 최대 기록 항목 수를 설정합니다. 로컬 inputrc 파일에서 해당 값을 확인한 결과 5000과 같은 것으로 나타났습니다. 더 큰 값으로 설정하면 문제가 해결되었습니다.

답변2

HISTSIZE를 처음 설정할 때 기록이 잘립니다. 따라서 이전에 ~/.bashrc에서 5000으로 설정한 경우,또는 /etc의 시스템 전체 bashrc에서, 주석 처리해야 합니다.

답변3

두 가지 HISTFILESIZE합계를 시도해 보세요 HISTSIZE.

답변4

나는 동일한 (또는 유사한) 문제가 있지만 inputrc는 괜찮습니다. 내 경우에는 주석을 HISTSIZE=1000달고 HISTFILESIZE=2000내 인벤토리에 저장하는 것뿐이었습니다 ~/.bashrc. 나중에 같은 파일에서 해당 변수를 재정의하더라도 말이죠!

관련 정보