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


25

HISTSIZE환경 변수를 5000보다 크게 설정 한 경우에도 history내장 목록으로 기록 목록을 인쇄 할 때 마지막 5000 명령 만 인쇄합니다. 나는 종종 .bash_history5000 줄을 초과 하는 큰 행을 가지고 있기 때문에 때로는을 눌러 초기 명령을 처리해야 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

나는 bash 4.1 또는 4.2에서 HISTSIZE=9999 HISTFILESIZE=999설정 .bashrc하고 6000 줄을 .bash_history모두 출력에 표시 할 수 없습니다 history. 당신의 배쉬 버전과 당신이 어디서 왔는지, 그리고 당신의 전체 내용을 알려주십시오 .bashrc.
Gilles 'SO- 악의를 멈춰라'

답장을 보내 주셔서 감사하지만 .bash_history는 6000 줄이며 HISTFILESIZE = 999입니까? GNU bassh 버전 4.1
Marwan Tanager를 사용합니다.

shopt -s histappend HISTSIZE = 50000 HISTFILESIZE = 500000
Marwan Tanager

죄송합니다 HISTFILESIZE=9999. 오타였습니다 . 은 .bash_history인위적으로 (내가 프롬프트에서 6000 명령을 입력하고 싶지 않았다) 시험에 구축하지만, bash는 출구에 제대로 저장하지되었다. .bashrc질문에 전체 내용 을 복사하여 붙여 넣으십시오 .
Gilles 'SO- 악마 그만'

을 수행하면 history | wc -l몇 줄이 표시됩니까?
Tim Post

답변:


16

이것은 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으로 확인했습니다. 더 큰 값으로 설정하면 문제가 해결되었습니다.


천장을 배치하지 않으면 HISTSIZE를 5000보다 큰 값으로 설정해도 쉘을 다시 시작한 후 히스토리 목록의 크기에 영향을 미치지 않는 이유는 무엇입니까? 5000 행보다 큰 히스토리 파일이있는 경우 .bashrc의 HISTSIZE를 5000보다 큰 값으로 설정 한 후 쉘을 다시 시작하고 history | 화장실 -l. 히스토리 목록이 HISTSIZE에 관계없이 5000 이하임을 알 수 있습니다. 그러나 HISTSIZE를 5000보다 작은 값으로 설정하면 동일한 실험을 통해 가시적 인 효과가 나타납니다.
Marwan Tanager

3
GNU readline library documentatin을 읽으면 옳다는 것이 밝혀졌습니다. inputrc 파일에서 읽을 수있는 history-size라는 변수가 있습니다. 해당 변수는 히스토리 목록에 저장된 최대 히스토리 항목 수를 설정합니다. 로컬 inputrc 파일의 값을 5000으로 확인했습니다. 더 큰 값으로 설정하면 문제가 해결되었습니다. :-) 통찰력을 주셔서 감사합니다
마르 완 타나 제 (Tanager)

@ Marwan Awesome :) 나는 그것이 history-sizeRL changelog에서 readline의 함수로 전달 된 것이 궁극적으로 bash에 의해 호출 되었다고 생각했다 . 우리가 함께 알아 낸 것 같습니다.
Tim Post

7

HISTSIZE를 처음 설정하면 히스토리가 잘 리므로 ~ / .bashrc 또는 / etc의 시스템 전체 bashrc에서 5000으로 설정 한 경우 주석 처리해야합니다.


5

모두 시도 HISTFILESIZE하고 HISTSIZE.


HISTFILESIZE를 50000으로 설정했습니다. 문제는 bash를 시작할 때 메모리에로드 될 .bash_history의 마지막 'HISTSIZE'행을 결정하고 ctrl-r 메커니즘을 사용할 수있는 HISTSIZE입니다.
Marwan Tanager

로그인하면 echo "$HISTSIZE $HISTFILESIZE" 무엇을 볼 수 있습니까?
ztank1013

"50000 500000"
Marwan Tanager

3

나는 같은 (또는 비슷한) 문제가 있었지만 inputrc는 괜찮 았습니다. 필자의 경우, 나중에 동일한 파일에서 해당 변수를 재정의하더라도 내 의견 HISTSIZE=1000HISTFILESIZE=2000재고 만 처리했습니다 ~/.bashrc!


2

이 줄을 바꾸면 ~/.bashrc나를 위해 고쳐 졌습니다 .

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

HISTFILESIZE=2000

그 후 파일을 저장하고 bashrc 파일을 다시로드 하십시오.

$ . ~/.bashrc

1

나는 당신이 HISTSIZE를 위해 당신의 OS에서 역사상 최고점에 도달하고 있다고 생각합니다. Solaris 10의 fc / history (KSH 실행) 매뉴얼 페이지에서 :

[한조각]

/ usr / bin / fc

fc 유틸리티는 대화식 sh에 이전에 입력 된 명령을 나열하거나 편집하고 다시 실행합니다.

명령 기록 목록은 번호로 명령을 참조합니다. 목록의 첫 번째 숫자는 임의로 선택됩니다. 사용자가 로그인하고 다른 프로세스가 목록에 액세스하고 있지 않은 경우를 제외하고 명령과 숫자의 관계는 변경되지 않습니다.이 때 시스템은 번호를 재설정하여 가장 오래 유지 된 명령을 다른 숫자 (보통 1)로 시작할 수 있습니다. . 숫자가 HISTSIZE 또는 32767 (둘 중 큰 값)의 값에 도달하면 쉘은 숫자를 줄이면서 다음 명령을 낮은 숫자 (보통 1)로 시작합니다. 그러나이 선택적 숫자 줄 바꿈에도 불구하고 fc는 명령의 시간 순서 순서를 유지합니다. 예를 들어, 순서대로 4 개의 명령에 숫자 32766, 32767, 1 (랩핑 됨)이 지정된 경우,

[한조각]

이는 fc 명령이 실행 기록 파일에서 최대 32767 개의 항목을 처리 할 수 ​​있으므로 실행 기록 파일에 보관 된 명령의 수에 대한 한계치가됩니다. 물론 YMMV이지만이 문제에 대해서는 OS 설명서 / 매뉴얼 페이지를 참조하십시오. 내 0.02 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.