HISTSIZE
環境変数を5000より大きく設定しても、履歴リストをhistory
組み込みで印刷すると、最後の5000コマンドのみが印刷されます。 5000行を超える大きな.bash_history
を使用することが多く、場合によっては、 Ctrl-R、しかし、そのコマンドが5000以上のコマンドである場合、そのメカニズムを使用してアクセスすることはできません。 .bash_history
でgrep
を使用できることはわかっていますが、 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
これは、履歴をロードする実際のコードです(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 doesは、履歴バッファがどれだけ大きくなるかを制限する機能を提供します。しかし、Bashはこれに厳しい上限を設定していません。少なくとも私が見つけることができる以上の値は無視されます。
編集
comments から、readline
は本当に犯人でした。私は(ばかげて)機能パラメータを見ていました:
inputrcファイルから読み取ることができるhistory-sizeという変数があります。この変数は、履歴リストに保存される履歴エントリの最大数を設定します。ローカルのinputrcファイルでその値を確認し、5000に等しいことを確認しました。これを大きな値に設定すると、問題が解決しました。
HISTSIZEが最初に設定されたときに履歴が切り捨てられるため、〜/ .bashrc、または/ etc内のシステム全体のbashrcでそれよりも前に5000に設定されている場合は、コメント化する必要があります。
HISTFILESIZE
とHISTSIZE
の両方を試してください。
私は同じ(または同様の)問題を抱えていましたが、inputrcは問題ありませんでした。私の場合、機能したのはコメントアウトHISTSIZE=1000
およびHISTFILESIZE=2000
在庫あり~/.bashrc
-同じファイルで後でこれらの変数をオーバーライドしていたとしても!
~/.bashrc
でこれらの行を変更すると、修正されました。
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=5000
HISTFILESIZE=2000
その後、ファイルを保存してbashrcファイルをリロードします
$ . ~/.bashrc
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 ...