Có cách nào để đặt kích thước của danh sách lịch sử trong bash thành hơn 5000 dòng không?


25

Cho dù tôi đặt HISTSIZEbiến môi trường lớn hơn 5000 bao nhiêu, khi in danh sách lịch sử với historynội dung, nó chỉ in 5000 lệnh cuối cùng. Tôi cần điều đó bởi vì tôi thường có một dòng lớn .bash_historyvượt quá 5000 dòng và đôi khi người ta cần xử lý một lệnh sớm bằng cách nhấn Ctrl-R, nhưng nếu lệnh đó sớm hơn 5000 lệnh, tôi không thể truy cập nó bằng cơ chế đó. Tôi biết tôi có thể sử dụng greptrên .bash_history, nhưng tôi nghĩ rằng Ctrl-Rcơ chế sẽ nhanh hơn nhiều (và thuận tiện). Tôi sử dụng gnu bash phiên bản 4.1.

Đó là toàn bộ nội dung của tệp .bashrc của tô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

Tôi không thể tái tạo điều này với bash 4.1 hoặc 4.2, HISTSIZE=9999 HISTFILESIZE=999được đặt trong .bashrc.bash_historytất cả 6000 dòng hiển thị trong đầu ra của history. Hãy cho chúng tôi biết phiên bản bash của bạn và bạn lấy nó từ đâu, và toàn bộ nội dung của bạn .bashrc.
Gilles 'SO- ngừng trở nên xấu xa'

cảm ơn vì đã trả lời, nhưng làm thế nào .bash_history của bạn là 6000 dòng và trong khi đó HISTFILESIZE = 999? Tôi sử dụng GNU bassh phiên bản 4.1
Marwan Tanager

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

Xin lỗi, đó là một lỗi đánh máy: tôi đã có HISTFILESIZE=9999. Việc .bash_historynày được xây dựng một cách nhân tạo cho thử nghiệm (tôi không muốn gõ 6000 lệnh tại dấu nhắc), nhưng bash không lưu nó đúng cách khi thoát. Vui lòng sao chép-dán đầy đủ của bạn .bashrcvào câu hỏi.
Gilles 'SO- ngừng trở nên xấu xa'

Nếu bạn làm một history | wc -l, có bao nhiêu dòng được hiển thị?
Tim Post

Câu trả lời:


16

Đây là mã thực tế tải lịch sử (từ bashhist.ckhoảng dòng 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 ();
    }
}

Nếu các giá trị của HISTSIZEHISTFILESIZEđược đặt, chúng sẽ được sử dụng.

Readline, thư viện mà thực sự xử lý đầu vào / chỉnh sửa dòng và lịch sử làm cơ sở đề nghị đặt một nắp trên chỉ lớn như thế nào bộ đệm lịch sử có thể phát triển. Tuy nhiên, Bash không đặt trần cứng vào điều này nơi mà các giá trị lớn hơn sẽ bị bỏ qua, ít nhất là tôi có thể tìm thấy.

Chỉnh sửa

Từ ý kiến , readlinethực sự là thủ phạm. Tôi đã tìm kiếm (khá ngu ngốc) tại các tham số chức năng:

có một biến được gọi là kích thước lịch sử có thể được đọc từ tệp inputrc. biến đó đặt số lượng mục lịch sử tối đa được lưu trong danh sách lịch sử. Tôi đã kiểm tra giá trị của nó trong tệp inputrc cục bộ của mình để tìm thấy nó bằng 5000. Đặt nó thành một giá trị lớn hơn đã giải quyết được vấn đề.


nếu nó không đặt trần, thì tại sao đặt HISTSIZE thành bất kỳ giá trị nào lớn hơn 5000 không ảnh hưởng đến kích thước của danh sách lịch sử sau khi khởi động lại vỏ? Nếu bạn có tệp lịch sử có kích thước lớn hơn 5000 dòng, hãy thử đặt HISTSIZE trong .bashrc thành giá trị lớn hơn 5000, sau đó khởi động lại trình bao và thực hiện lịch sử | wc -l. Bạn sẽ thấy rằng danh sách lịch sử nhỏ hơn hoặc bằng 5000 bất kể HISTSIZE. Tuy nhiên, đặt HISTSIZE thành bất kỳ giá trị nào dưới 5000 sẽ tạo ra hiệu ứng có thể nhìn thấy bằng cách sử dụng cùng một thử nghiệm.
Marwan Tanager

3
Đọc tài liệu thư viện readline của GNU, hóa ra bạn đã đúng. có một biến được gọi là kích thước lịch sử có thể được đọc từ tệp inputrc. biến đó đặt số lượng mục lịch sử tối đa được lưu trong danh sách lịch sử. Tôi đã kiểm tra giá trị của nó trong tệp inputrc cục bộ của mình để tìm thấy nó bằng 5000. Đặt nó thành giá trị lớn hơn đã giải quyết được vấn đề. Cảm ơn những hiểu biết :-)
Marwan Tanager

@Marwan Tuyệt vời :) Tôi nghĩ rằng đó history-sizelà một cái gì đó đã được thông qua (từ thay đổi RL) đến các chức năng trong readline tha t cuối cùng được gọi bằng bash. Có vẻ như chúng tôi đã tìm ra nó cùng nhau.
Tim Post

7

Lịch sử của bạn bị cắt ngắn lần đầu tiên HISTSIZE được đặt, vì vậy nếu nó được đặt thành 5000 trước đó trong ~ / .bashrc hoặc trong bashrc trên toàn hệ thống trong / etc , bạn cần nhận xét chúng.


5

Hãy thử cả hai HISTFILESIZEHISTSIZE.


Tôi đặt HISTFILESIZE thành 50000. Vấn đề là ở HISTSIZE xác định các dòng 'HISTSIZE' cuối cùng trong .bash_history sẽ được tải vào bộ nhớ khi bắt đầu bash và khi đó bạn có thể sử dụng cơ chế ctrl-r.
Marwan Tanager

Khi bạn đã đăng nhập nếu bạn nhập echo "$HISTSIZE $HISTFILESIZE" những gì bạn thấy?
ztank1013

Nó tạo ra: "50000 500000"
Marwan Tanager

3

Tôi đã có cùng một vấn đề (hoặc tương tự), nhưng inputrc vẫn ổn. Trong trường hợp của tôi, điều duy nhất có hiệu quả là bình luận HISTSIZE=1000HISTFILESIZE=2000trong kho của tôi ~/.bashrc- mặc dù sau đó tôi đã ghi đè lên các lọ đó trong cùng một tệp!


2

Thay đổi những dòng này trong ~/.bashrccố định nó cho tôi:

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

HISTFILESIZE=2000

Sau đó lưu tệp và tải lại tệp bashrc

$ . ~/.bashrc

1

Tôi nghĩ rằng bạn có thể đạt được mức trần lịch sử trên HĐH cho HISTSIZE. Từ trang man cho fc / history trong Solaris 10 (đang chạy KSH):

[bắn tỉa]

/ usr / bin / fc

Tiện ích fc liệt kê hoặc chỉnh sửa và reexecutes, các lệnh được nhập trước vào một sh ​​tương tác.

Danh sách lịch sử lệnh tham chiếu các lệnh theo số. Số đầu tiên trong danh sách được chọn tùy ý. Mối quan hệ của một số với lệnh của nó sẽ không thay đổi trừ khi người dùng đăng nhập và không có quá trình nào khác truy cập vào danh sách, tại thời điểm đó, hệ thống có thể đặt lại số để bắt đầu lệnh giữ lại cũ nhất ở một số khác (thường là 1) . Khi số đạt đến giá trị trong HISTSIZE hoặc 32767 (tùy theo giá trị nào lớn hơn), shell có thể bao bọc các số, bắt đầu lệnh tiếp theo với số thấp hơn (thường là 1). Tuy nhiên, mặc dù gói số tùy chọn này, fc sẽ duy trì chuỗi thứ tự thời gian của các lệnh. Ví dụ: nếu bốn lệnh theo thứ tự được đưa ra các số 32 766, 32 767, 1 (được bao bọc),

[bắn tỉa]

trong đó ngụ ý rằng lệnh fc có thể xử lý tối đa 32767 mục trong tệp lịch sử, làm cho nó trở thành mức trần cứng đối với số lượng lệnh được lưu trong tệp lịch sử. Tất nhiên là YMMV, nhưng tôi nghĩ bạn có thể tham khảo tài liệu / trang hướng dẫn hệ điều hành của mình về vấn đề này. 0,02 của tôi ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.