Есть ли способ установить размер списка истории в bash более 5000 строк?

25

Независимо от того, насколько я установил HISTSIZEпеременную среды больше 5000, при печати списка истории с помощью historyвстроенной функции он печатает только последние 5000 команд. Мне это нужно, потому что у меня часто есть большое значение, .bash_historyкоторое превышает 5000 строк, а иногда нужно обратиться к ранней команде, нажав 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и строкой .bash_historyиз 6000 строк, которые отображаются в выходных данных history. Расскажите нам свою версию bash и откуда вы ее взяли, а также полное содержание вашей .bashrc.
Жиль "ТАК - перестань быть злым"
спасибо за ответ, но как ваш .bash_history имеет 6000 строк и между тем HISTFILESIZE = 999? Я использую GNU Bassh версии 4.1
Marwan Tanager
shopt -s histappend HISTSIZE = 50000 HISTFILESIZE = 500000
Марван Тэнэджер
Извините, это была опечатка: у меня было HISTFILESIZE=9999. Он .bash_historyбыл искусственно создан для теста (я не хотел вводить 6000 команд в командной строке), но bash сохраняет его правильно при выходе. Пожалуйста, скопируйте и вставьте свой полный .bashrcвопрос.
Жиль "ТАК - перестань быть злым"
Если вы делаете history | wc -l, сколько строк показано?
Тим Пост

Ответы:

16

Это фактический код, который загружает историю ( 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. Установка большего значения решила проблему.

Тим Пост
источник
если он не устанавливает потолок, то почему установка значения HISTSIZE больше 5000 не влияет на размер списка истории после перезапуска оболочки? Если у вас есть файл истории размером более 5000 строк, попробуйте установить значение HISTSIZE в .bashrc больше 5000, затем перезапустите оболочку и выполните history | туалет Вы увидите, что список истории меньше или равен 5000 независимо от HISTSIZE. Однако, установив HISTSIZE на любое значение меньше 5000, вы получите видимый эффект, используя тот же эксперимент.
Марван Танагер
3
Читая документацию библиотеки чтения строк GNU, оказалось, что вы правы. есть переменная под названием history-size, которую можно прочитать из файла inputrc. эта переменная устанавливает максимальное количество записей истории, сохраненных в списке истории. Я проверил его значение в своем локальном файле inputrc, чтобы найти его равным 5000. Установка большего значения решила проблему. Спасибо за понимание :-)
Марван Тэнэджер
@Marwan Awesome :) Я думал, что это history-sizeбыло что-то, что было передано (из журнала изменений RL) функциям в readline, которые в конечном итоге были вызваны bash. Похоже, мы поняли это вместе.
Тим Пост
7

Ваша история усекается при первой установке HISTSIZE, поэтому, если она установлена ​​на 5000 ранее в вашем ~ / .bashrc или в общесистемном bashrc в / etc , вы должны закомментировать их.

Эмиль Микулич
источник
5

Попробуйте оба HISTFILESIZEи HISTSIZE.

ztank1013
источник
Я установил HISTFILESIZE на 50000. Проблема в том, что HISTSIZE определяет последние строки 'HISTSIZE' в .bash_history для загрузки в память при запуске bash и для которых вы можете использовать механизм ctrl-r.
Марван Танагер
После того, как вы вошли в систему, если вы печатаете, echo "$HISTSIZE $HISTFILESIZE" что вы видите?
ztank1013
Он производит: «50000 500000»
Marwan Tanager
3

У меня была такая же (или похожая) проблема, но inputrc был в порядке. В моем случае единственное, что сработало, - это комментирование HISTSIZE=1000и HISTFILESIZE=2000на моем складе ~/.bashrc- хотя я переопределял эти переменные позже в том же файле!

хорошо относиться к своим модам
источник
2

Изменение этих строк ~/.bashrcисправило это для меня:

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

HISTFILESIZE=2000

После этого сохраните файл и перезагрузите файл bashrc.

$ . ~/.bashrc
Джавид Шакель
источник
1

Я думаю, что вы можете достичь исторического потолка на вашей ОС для HISTSIZE. На странице руководства для fc / history в Solaris 10 (под управлением KSH):

[Надрез]

/ USR / бен / к

Утилита fc выводит на экран или редактирует и повторно выполняет команды, ранее введенные в интерактивную sh.

Список истории команд ссылается на команды по номерам. Первый номер в списке выбирается произвольно. Отношение числа к его команде не изменится, за исключением случаев, когда пользователь входит в систему, и никакой другой процесс не обращается к списку, и в это время система может сбросить нумерацию, чтобы запустить самую старую сохраненную команду с другого номера (обычно 1). , Когда число достигает значения в HISTSIZE или 32767 (в зависимости от того, что больше), оболочка может переносить числа, начиная следующую команду с меньшего числа (обычно 1). Однако, несмотря на эту необязательную упаковку чисел, fc будет поддерживать последовательность команд по времени. Например, если четырем командам по порядку даны номера 32 766, 32 767, 1 (завернутый),

[Надрез]

Это означает, что команда fc может адресовать до 32767 записей в файле истории, что делает ее жестким потолком для количества команд, хранящихся в файле истории. Конечно, YMMV, но я думаю, что вы можете проконсультироваться с вашей документацией по ОС / справочными страницами по этому вопросу. Мой 0.02 ...

FanDeLaU
источник