Чи є спосіб встановити розмір списку історії в 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, і 6000-рядка, .bash_historyвсі з яких відображаються на виході 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справді був винуватцем. Я дивився (досить нерозумно) на функціональні параметри:

є змінна назва, розмір історії, яку можна прочитати з файлу inputrc. ця змінна встановлює максимальну кількість записів історії, збережених у списку історії. Я перевірив, що це значення у моєму локальному файлі inputrc, щоб він виявився рівним 5000. Встановлення великого значення вирішило проблему.


якщо на ній не розміщено стелю, то чому встановлення HISTSIZE на будь-яке значення більше 5000 не впливає на розмір списку історії після перезавантаження оболонки? Якщо у вас є файл історії розміром понад 5000 рядків, спробуйте встановити HISTSIZE в .bashrc на значення, що перевищує 5000, а потім перезапустіть оболонку та виконайте історію | wc -l. Ви побачили, що список історії менший або рівний 5000 незалежно від ІСТИНИ. Однак встановлення HISTSIZE на будь-яке значення менше 5000 призведе до видимого ефекту за допомогою того ж експерименту.
Marwan Tanager

3
Ознайомившись з документалітінатом бібліотеки для читання GNU, виявилося, що ви праві. є змінна назва, розмір історії, яку можна прочитати з файлу inputrc. ця змінна встановлює максимальну кількість записів історії, збережених у списку історії. Я перевірив, що це значення у моєму локальному файлі inputrc, щоб він виявився рівним 5000. Встановлення великого значення вирішило проблему. Дякую за розуміння :-)
Marwan Tanager

@Marwan Awesome :) Я подумав, що history-sizeщось було передано (з журналу змін RL) до функцій у читальній лінії, які в кінцевому підсумку називали bash. Схоже, ми разом це зрозуміли.
Тім Пост

7

Ваша історія обрізається вперше, коли встановлюється HISTSIZE, тому якщо вона встановлена ​​на 5000 раніше у вашому ~ / .bashrc або в загальносистемному bashrc в / і т. Д. , Вам потрібно прокоментувати їх.


5

Спробуйте і те, HISTFILESIZEі HISTSIZE.


Я встановив HISTFILESIZE рівним 50000. Проблема полягає в HISTSIZE, який визначає останні рядки "HISTSIZE" в .bash_history для завантаження в пам'ять при запуску bash і за допомогою якого ви можете використовувати механізм ctrl-r.
Marwan Tanager

Після входу в систему, якщо ви введете 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

Я думаю, що ви можете потрапити на стелю історії на вашій ОС для ІСТИНИ. З довідкової сторінки для fc / історії в Solaris 10 (працює KSH):

[сніп]

/ usr / bin / fc

Утиліта fc перераховує або редагує та повторно виконує команди, попередньо введені в інтерактивний ш.

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

[сніп]

що означає, що команда fc може адресувати до 32767 записів у файлі історії, що робить її жорсткою стелею для кількості команд, що зберігаються у файлі історії. Звичайно, YMMV, але я думаю, ви могли б ознайомитися зі своєю документацією / документацією на ОС щодо цього питання. Мої 0,02 ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.