web-dev-qa-db-ja.com

bashの履歴リストのサイズを5000行以上に設定する方法はありますか?

HISTSIZE環境変数を5000より大きく設定しても、履歴リストをhistory組み込みで印刷すると、最後の5000コマンドのみが印刷されます。 5000行を超える大きな.bash_historyを使用することが多く、場合によっては、 Ctrl-R、しかし、そのコマンドが5000以上のコマンドである場合、そのメカニズムを使用してアクセスすることはできません。 .bash_historygrepを使用できることはわかっていますが、 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
26
Marwan Tanager

これは、履歴をロードする実際のコードです(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 ();
    }
}

HISTSIZEHISTFILESIZEの値が設定されている場合は、それらが使用されます。

入力/行編集と履歴を実際に処理するライブラリであるReadline doesは、履歴バッファがどれだけ大きくなるかを制限する機能を提供します。しかし、Bashはこれに厳しい上限を設定していません。少なくとも私が見つけることができる以上の値は無視されます。

編集

comments から、readlineは本当に犯人でした。私は(ばかげて)機能パラメータを見ていました:

inputrcファイルから読み取ることができるhistory-sizeという変数があります。この変数は、履歴リストに保存される履歴エントリの最大数を設定します。ローカルのinputrcファイルでその値を確認し、5000に等しいことを確認しました。これを大きな値に設定すると、問題が解決しました。

16
Tim Post

HISTSIZEが最初に設定されたときに履歴が切り捨てられるため、〜/ .bashrc、または/ etc内のシステム全体のbashrcでそれよりも前に5000に設定されている場合は、コメント化する必要があります。

8
Emil Mikulic

HISTFILESIZEHISTSIZEの両方を試してください。

5
ztank1013

私は同じ(または同様の)問題を抱えていましたが、inputrcは問題ありませんでした。私の場合、機能したのはコメントアウトHISTSIZE=1000およびHISTFILESIZE=2000在庫あり~/.bashrc-同じファイルで後でこれらの変数をオーバーライドしていたとしても!

~/.bashrcでこれらの行を変更すると、修正されました。

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

HISTFILESIZE=2000

その後、ファイルを保存してbashrcファイルをリロードします

$ . ~/.bashrc
2
javeed shakeel

OSでHISTSIZEの履歴の上限に達している可能性があります。 Solaris 10(KSHを実行)のfc/historyのマニュアルページから:

[をちょきちょきと切る]

/ usr/bin/fc

Fcユーティリティは、以前に対話型shに入力されたコマンドを一覧表示または編集して再実行します。

コマンド履歴リストは、番号でコマンドを参照します。リストの最初の番号は任意に選択されます。ユーザーがログインし、他のプロセスがリストにアクセスしていない場合を除いて、番号とそのコマンドの関係は変わりません。その場合、システムは番号をリセットして、最も古い保持されたコマンドを別の番号(通常は1)で開始します。 。数値がHISTSIZEまたは32767(どちらか大きい方)の値に達すると、シェルは数値を折り返し、次のコマンドを小さい数値(通常は1)で開始します。ただし、このオプションの数値の折り返しにもかかわらず、fcはコマンドの時間順のシーケンスを維持します。たとえば、順番に4つのコマンドに32 766、32 767、1(ラップ)、および2を実行すると、コマンド32 767は1より前のコマンドと見なされます。

[をちょきちょきと切る]

これは、fcコマンドが履歴ファイル内の最大32767のエントリをアドレス指定できることを意味し、履歴ファイルに保持されるコマンドの数を厳しく制限します。もちろんYMMVですが、この件についてはOSのドキュメントやマニュアルページを参照してください。私の0.02 ...

1
FanDeLaU