Existe uma maneira de definir o tamanho da lista de histórico no bash para mais de 5000 linhas?

25

Não importa quanto eu defina a variável de ambiente HISTSIZE para ser maior que 5000, ao imprimir a lista de histórico com o history builtin, ele imprime apenas os últimos 5000 comandos. Eu preciso disso porque muitas vezes eu tenho um grande .bash_history que excede 5000 linhas, e às vezes é necessário endereçar um comando inicial pressionando Ctrl-R , mas se esse comando tiver mais de 5000 comandos anteriores, Eu não posso acessá-lo usando esse mecanismo. Eu sei que posso usar grep no .bash_history , mas acho que o mecanismo Ctrl-R seria muito mais rápido (e conveniente). Eu uso o gnu bash versão 4.1.

Esse é o conteúdo completo do meu arquivo .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)}\[3[01;32m\]\u@\h\         [3[00m\]:\[3[01;34m\]\w\[3[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
    
por Marwan Tanager 16.09.2011 / 14:40

6 respostas

16

Este é o código real que carrega o histórico (de bashhist.c na linha 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 ();
    }
}

Se os valores de HISTSIZE e HISTFILESIZE estiverem definidos, eles serão usados.

Readline, a biblioteca que realmente lida com edição de linha / entrada e histórico faz oferecer facilidades para limitar o tamanho do buffer de histórico. No entanto, Bash não coloca um teto duro sobre isso, onde valores maiores seriam ignorados, pelo menos que eu poderia encontrar.

Editar

De comentários , readline foi de fato o culpado. Eu estava procurando (um pouco tolo) em parâmetros funcionais:

there is a variable called history-size that can be read from the inputrc file. that variable sets the maximum number of history entries saved in the history list. I checked it's value in my local inputrc file to found it equal 5000. Setting it to a larger value solved the problem.

    
por 17.09.2011 / 15:55
7

Seu histórico é truncado na primeira vez em que HISTSIZE é definido, portanto, se estiver definido como 5000 anteriormente em seu ~ / .bashrc, ou no bashrc do sistema em / etc , você precisará comentar aqueles fora.

    
por 01.09.2014 / 08:32
4

Experimente os dois HISTFILESIZE e HISTSIZE .

    
por 16.09.2011 / 15:57
3

Eu tive o mesmo (ou um similar) problema, mas inputrc estava bem. No meu caso, a única coisa que funcionava era comentar HISTSIZE=1000 e HISTFILESIZE=2000 no meu estoque ~/.bashrc - mesmo que eu estivesse substituindo essas variáveis mais tarde no mesmo arquivo!

    
por 24.04.2013 / 17:08
2

Alterar essas linhas em ~/.bashrc corrigiu para mim:

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

HISTFILESIZE=2000

Depois disso, salve o arquivo e recarregue o arquivo bashrc

$ . ~/.bashrc
    
por 26.09.2017 / 11:15
1

Acho que você pode estar atingindo um limite histórico no seu sistema operacional para o HISTSIZE. Na página man do fc / history no Solaris 10 (executando o KSH):

[snip]

/usr/bin/fc

The fc utility lists or edits and reexecutes, commands pre- viously entered to an interactive sh.

The command history list references commands by number. The first number in the list is selected arbitrarily. The rela- tionship of a number to its command will not change except when the user logs in and no other process is accessing the list, at which time the system may reset the numbering to start the oldest retained command at another number (usually 1). When the number reaches the value in HISTSIZE or 32767 (whichever is greater), the shell may wrap the numbers, starting the next command with a lower number (usually 1). However, despite this optional wrapping of numbers, fc will maintain the time-ordering sequence of the commands. For example, if four commands in sequence are given the numbers 32 766, 32 767, 1 (wrapped), and 2 as they are executed, command 32 767 is considered the command previous to 1, even though its number is higher.

[snip]

que implica que o comando fc pode endereçar até 32767 entradas no arquivo de histórico, tornando-se um teto rígido para o número de comandos mantidos no arquivo de histórico. Claro YMMV, mas eu acho que você poderia consultar a documentação do seu sistema operacional / man pages sobre este assunto. Meus 0,02 ...

    
por 05.05.2014 / 20:19