Tarihçe listesinin boyutunu bash olarak 5000'den fazla satıra ayarlamanın bir yolu var mı?


25

HISTSIZEOrtam değişkenini ne kadar büyük olursa olsun 5000 değerinden daha büyük olarak ayarlayın, geçmiş listesini historyyerleşik olarak yazdırırken, yalnızca son 5000 komutunu yazdırır. Buna ihtiyacım var çünkü sık sık .bash_history5000 satırı aşan bir büyüklüğe sahibim ve bazen bir basma ile erken bir komutu ele almam gerekiyor Ctrl-R, ancak bu komut daha önce 5000 komuttan fazlaysa, bu mekanizmayı kullanarak erişemiyorum. Ben kullanabilir biliyorum grepüzerinde .bash_history, ama sanırım Ctrl-Rmekanizma çok daha hızlı (ve kullanışlı) olacaktır. Gnu bash sürüm 4.1 kullanıyorum.

.Bashrc dosyamın tam içeriği:

    #!/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

Ben bash 4.1 veya 4.2 ile bu yeniden olamaz HISTSIZE=9999 HISTFILESIZE=999sete .bashrcve 6000 satırlık .bash_historytüm çıkışında göstermek history. Bize bash versiyonunuzu ve nereden aldığınızı ve tüm içeriğinizi söyleyin .bashrc.
Gilles 'SO- kötülük' dur

Cevabınız için teşekkürler, ama .bash_history'niz 6000-satır ve bu arada HISTFILESIZE = 999 nasıl? GNU bassh sürüm 4.1 kullanıyorum
Marwan Tanager

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

Üzgünüm, bu bir yazım hatası oldu: Ben vardı HISTFILESIZE=9999. .bash_historyYapay (Ben istemi de 6000 komutları yazın istemiyordu) test için inşa fakat bash Çıkışta gerektiği gibi tasarruf yapar edildi. Lütfen .bashrcsorunuzu sonuna kopyalayıp yapıştırın .
Gilles 'SO- kötülük yapmayı bırak'

A yaparsanız history | wc -lkaç satır gösterilir?
Tim Post

Yanıtlar:


16

Bu, geçmişi yükleyen asıl koddur ( bashhist.csatır 260 civarında):

/* 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 ();
    }
}

Değerleri HISTSIZEve HISTFILESIZEayarlanırsa, bunlar kullanılacaktır.

Readline, aslında giriş / hat düzenleme kolları ve tarih kütüphanesi yapar geçmiş tampon büyüyebilir ne kadar büyük bir kap koymak için teklif imkanları. Ancak, Bash, en azından bulabildiğim kadar büyük olan değerlerin göz ardı edileceği bir yere sert bir tavan yerleştirmiyor.

Düzenle

Gönderen yorumların , readlinegerçekten suçlu oldu. İşlevsel parametrelere (aptalca) bakıyordum:

inputrc dosyasından okunabilecek bir tarih-boyut adı verilen bir değişken vardır. bu değişken geçmiş listesine kaydedilen maksimum geçmiş girişi sayısını ayarlar. Yerel inputrc dosyamdaki değeri 5000 olarak eşitlemek için kontrol ettim. Daha büyük bir değere ayarlamak sorunu çözdü.


bir tavan yerleştirmiyorsa, neden HISTSIZE'ı 5000'den büyük bir değere ayarlamak kabuğun yeniden başlatılmasından sonra geçmiş listesinin boyutu üzerinde bir etkiye sahip değildir? 5000 satırdan daha büyük bir geçmiş dosyanız varsa, .bashrc içindeki HISTSIZE öğesini 5000'den büyük bir değere ayarlamayı deneyin, sonra kabuğu yeniden başlatın ve geçmişi yürütün | wc Geçmiş listesinin TARİH'e bakmaksızın 5000'den az veya ona eşit olduğunu göreceksiniz. Bununla birlikte, HISTSIZE değerini 5000'den daha düşük bir değere ayarlamak aynı deneyi kullanarak gözle görülür bir etki yaratacaktır.
Marwan Tanager 17:11

3
GNU okuma hattı kütüphanesi belgesinin okunması, haklı çıktı. inputrc dosyasından okunabilecek bir tarih-boyut adı verilen bir değişken vardır. bu değişken geçmiş listesine kaydedilen maksimum geçmiş girişi sayısını ayarlar. Yerel inputrc dosyamdaki değeri 5000 olarak eşitlemek için kontrol ettim. Daha büyük bir değere ayarlamak sorunu çözdü. Yorumlarınız için teşekkürler :-)
Marwan Tanager

@Marwan Awesome :) Bunun history-size(RL changelog'dan) okuma satırındaki fonksiyonlara nihayetinde bash tarafından çağrılan bir şey olduğunu düşündüm . Beraber çözdük gibi görünüyor.
Tim Post

7

HISTSIZE ilk kez ayarlandığında tarihçeniz kesiliyor, bu nedenle ~ / .bashrc'nizde veya daha önce 5000'de ayarlanmışsa , / etc içinde sistem genelinde bashrc varsa, bunları yorumlamanız gerekir.


5

Her iki deneyin HISTFILESIZEve HISTSIZE.


HISTFILESIZE değerini 50000 olarak belirledim. Sorun, bash işlemine başlarken ve ctrl-r mekanizmasını kullanabilmeniz için .bash_history'deki son 'HISTSIZE' satırını belleğe yüklenecek olan belirleyen HISTSIZE ile ilgili.
Marwan Tanager 16:11

Bir kez giriş yaptıysanız giriş yaptıktan sonra echo "$HISTSIZE $HISTFILESIZE" ne görüyorsunuz?
ztank1013 16:11

Üreten: "50000 500000"
Marwan Tanager 17:11

3

Aynı (veya benzer) bir problem vardı, ama inputrc iyiydi. Benim durumumda, çalıştığı tek şey dışarı yorumlarken geldi HISTSIZE=1000ve HISTFILESIZE=2000benim stokta ~/.bashrcO aynı dosyada sonradan vars geçersiz kılma olmasına rağmen -!


2

Bu satırları değiştirmek ~/.bashrcbenim için düzeltti:

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

HISTFILESIZE=2000

Bundan sonra dosyayı kaydedin ve bashrc dosyasını yeniden yükleyin.

$ . ~/.bashrc

1

Sanırım, HISTSIZE için işletim sisteminizde bir tarih tavanına çarpıyor olabilirsiniz. Solaris 10’da fc / history için man sayfasından (KSH’yi çalıştırma):

[Kesik]

/ Usr / bin / fc

Fc yardımcı programı önceden etkileşimli olarak girilen komutları listeler veya düzenler ve yeniden düzenler, komutlar.

Komut geçmişi listesi, komutları numarasına göre gösterir. Listedeki ilk numara isteğe bağlı olarak seçilir. Bir numaranın komutuna olan ilişkisi, kullanıcının giriş yaptığı ve listeye başka bir işlem girmediği sürece değişmeyecektir; bu sırada sistem en eski tutulan komutu başka bir numaradan başlatmak için numaralandırmayı sıfırlayabilir (genellikle 1) . Sayı HISTSIZE veya 32767 (hangisi daha büyükse) içindeki değere ulaştığında, kabuk bir sonraki komutu daha düşük bir numara ile başlatarak (genellikle 1) sayıları sarabilir. Ancak, bu isteğe bağlı sayıların sarılmasına rağmen, fc komutların zaman sıralamasını koruyacaktır. Örneğin, sırasıyla dört komut verildiğinde, 32 766, 32 767, 1 (sarılı) sayıları,

[Kesik]

Bu, fc komutunun, geçmiş dosyasında 32767 girişe kadar adres verebileceğini ve bunu geçmiş dosyasında tutulan komutların sayısı için sabit bir tavan yapabileceği anlamına gelir. Tabii ki YMMV, ancak bu konuyla ilgili işletim sistemi dokümantasyonunuza / man sayfalarınıza başvurabileceğinizi düşünüyorum. Benim 0.02

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.