มีวิธีตั้งค่าขนาดของรายการประวัติเป็น bash มากกว่า 5,000 บรรทัดหรือไม่?


25

ไม่ว่าฉันจะตั้งค่าHISTSIZEตัวแปรสภาพแวดล้อมให้ใหญ่กว่า 5,000 เท่าไหร่เมื่อพิมพ์รายการประวัติด้วยhistorybuiltin มันจะพิมพ์เฉพาะคำสั่ง 5000 ล่าสุดเท่านั้น ฉันต้องการสิ่งนั้นเพราะฉันมักจะมีขนาดใหญ่.bash_historyซึ่งเกิน 5,000 บรรทัดและบางครั้งหนึ่งต้องระบุคำสั่งก่อนหน้าโดยกดCtrl-Rแต่ถ้าคำสั่งนั้นมากกว่า 5,000 คำสั่งก่อนหน้าฉันไม่สามารถเข้าถึงได้โดยใช้กลไกนั้น ฉันรู้ว่าฉันสามารถใช้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

ฉันไม่สามารถทำซ้ำนี้กับทุบตี 4.1 หรือ 4.2, HISTSIZE=9999 HISTFILESIZE=999ตั้งอยู่ใน.bashrcและ 6000 สายทั้งหมดที่ปรากฏขึ้นในการส่งออกของ.bash_history บอกให้เราทราบรุ่นของทุบตีและสถานที่ที่คุณได้รับมันจากและเนื้อหาทั้งหมดของคุณhistory .bashrc
Gilles 'หยุดชั่วร้าย'

ขอบคุณสำหรับการตอบกลับ แต่วิธี. bash_history ของคุณคือ 6000 บรรทัดและในขณะเดียวกัน HISTFILESIZE = 999 ฉันใช้ GNU bassh เวอร์ชั่น 4.1
Marwan Tanager

shopt -s histappend HISTSIZE = 50,000 HISTFILESIZE = 500000
Marwan Tanager

ขออภัยที่ถูกพิมพ์ผิด: HISTFILESIZE=9999ฉันมี .bash_historyถูกสร้างเทียมสำหรับการทดสอบ (ฉันไม่ต้องการที่จะพิมพ์ 6000 คำสั่งที่พร้อมท์) แต่ทุบตีไม่ประหยัดได้อย่างถูกต้องเมื่อออกจาก กรุณาคัดลอกของคุณเต็ม.bashrcคำถาม
Gilles 'หยุดความชั่วร้าย'

ถ้าคุณทำ a history | wc -l, จะแสดงจำนวนบรรทัดเท่าไร?
Tim Post

คำตอบ:


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 ไลบรารีที่จัดการการแก้ไขอินพุต / บรรทัดและประวัติจริงมีสิ่งอำนวยความสะดวกในการเพิ่มขีดความสามารถของบัฟเฟอร์ประวัติขนาดใหญ่ อย่างไรก็ตามทุบตีไม่ได้วางเพดานอย่างหนักในที่นี้ซึ่งค่าใด ๆ ที่มีขนาดใหญ่กว่าจะถูกละเว้นอย่างน้อยที่สุดที่ฉันสามารถหา

แก้ไข

จากความเห็น , readlineเป็นจริงผู้กระทำผิด ฉันกำลังดู (ค่อนข้างโง่) พารามิเตอร์การทำงาน:

มีตัวแปรชื่อ history-size ที่สามารถอ่านได้จากไฟล์ inputrc ตัวแปรนั้นตั้งค่าจำนวนรายการประวัติสูงสุดที่บันทึกในรายการประวัติ ฉันตรวจสอบว่ามันมีค่าในไฟล์ inputrc ในพื้นที่ของฉันเพื่อพบว่าเท่ากับ 5,000 การตั้งค่าเป็นค่าที่มากขึ้นช่วยแก้ปัญหาได้


หากมันไม่มีเพดานดังนั้นทำไมการตั้งค่า HISTSIZE เป็นค่าใด ๆ ที่มากกว่า 5000 จะไม่มีผลกับขนาดของรายการประวัติหลังจากรีสตาร์ทเชลล์? หากคุณมีไฟล์ประวัติที่มีขนาดมากกว่า 5,000 บรรทัดให้ลองตั้งค่า HISTSIZE ใน. bashrc เป็นค่าที่มากกว่า 5000 จากนั้นรีสตาร์ทเชลล์และเรียกใช้ประวัติ | ห้องสุขา -l คุณจะเห็นว่ารายการประวัติมีค่าน้อยกว่าหรือเท่ากับ 5,000 โดยไม่คำนึงถึง HISTSIZE อย่างไรก็ตามการตั้งค่า HISTSIZE เป็นค่าใด ๆ ที่น้อยกว่า 5,000 จะให้ผลที่มองเห็นได้โดยใช้การทดสอบเดียวกัน
Marwan Tanager

3
การอ่านเอกสารไลบรารี readline ของ GNU มันกลับกลายเป็นว่าคุณพูดถูก มีตัวแปรชื่อ history-size ที่สามารถอ่านได้จากไฟล์ inputrc ตัวแปรนั้นตั้งค่าจำนวนรายการประวัติสูงสุดที่บันทึกในรายการประวัติ ฉันตรวจสอบว่ามันมีค่าในไฟล์ inputrc ในพื้นที่ของฉันเพื่อพบว่าเท่ากับ 5,000 การตั้งค่าเป็นค่าที่มากขึ้นช่วยแก้ปัญหาได้ ขอบคุณสำหรับข้อมูลเชิงลึก :-)
Marwan Tanager

@ Marwan Awesome :) ฉันคิดว่านั่นhistory-sizeเป็นสิ่งที่ผ่าน (จาก RL changelog) ไปจนถึงฟังก์ชั่นใน readline tha t ในที่สุดก็ถูกเรียกโดย bash ดูเหมือนว่าเราจะคิดออกมาด้วยกัน
Tim Post

7

ประวัติของคุณจะถูกตัดทอนเมื่อมีการตั้งค่า HISTSIZE ครั้งแรกดังนั้นหากตั้งค่าเป็น 5000 ก่อนหน้าใน ~ / .bashrc ของคุณหรือใน bashrc ทั่วทั้งระบบใน / etcคุณต้องแสดงความคิดเห็นเหล่านั้น


5

ลองทั้งสองและHISTFILESIZEHISTSIZE


ฉันตั้งค่า HISTFILESIZE เป็น 50,000 ปัญหาอยู่กับ HISTSIZE ซึ่งกำหนดบรรทัด 'HISTSIZE' สุดท้ายใน. bash_history ที่จะโหลดลงในหน่วยความจำเมื่อเริ่มการทุบตีและคุณสามารถใช้กลไก ctrl-r
Marwan Tanager

เมื่อคุณเข้าสู่ระบบหากคุณพิมพ์ echo "$HISTSIZE $HISTFILESIZE" สิ่งที่คุณเห็น?
ztank1013

มันผลิต: "50000 500000"
Marwan Tanager

3

ฉันมีปัญหาเดียวกัน (หรือคล้ายกัน) แต่ inputrc ก็ใช้ได้ ในกรณีของฉันสิ่งเดียวที่ทำงานคือการแสดงความคิดเห็นHISTSIZE=1000และHISTFILESIZE=2000ในสต็อกของฉัน~/.bashrc- แม้ว่าฉันจะเอาชนะ vars เหล่านั้นในภายหลังในไฟล์เดียวกัน!


2

การเปลี่ยนบรรทัดเหล่านี้~/.bashrcคงที่สำหรับฉัน:

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

HISTFILESIZE=2000

หลังจากนั้นให้บันทึกไฟล์และโหลดไฟล์bashrcใหม่

$ . ~/.bashrc

1

ฉันคิดว่าคุณอาจกดปุ่มประวัติความเป็นมาในระบบปฏิบัติการของคุณสำหรับ HISTSIZE จาก man page สำหรับ fc / history ใน Solaris 10 (การรัน KSH):

[snip]

/ usr / bin / fc

รายการยูทิลิตี้ fc หรือแก้ไขและเปิดใช้งานใหม่คำสั่งป้อนล่วงหน้าเพื่อการโต้ตอบ SH

รายการประวัติคำสั่งอ้างอิงคำสั่งตามหมายเลข หมายเลขแรกในรายการจะถูกเลือกโดยพลการ ความสัมพันธ์ของตัวเลขกับคำสั่งจะไม่เปลี่ยนแปลงยกเว้นเมื่อผู้ใช้ล็อกอินและไม่มีกระบวนการอื่นเข้าถึงรายการซึ่งระบบอาจรีเซ็ตหมายเลขเพื่อเริ่มต้นคำสั่งที่เก็บไว้เก่าที่สุดที่หมายเลขอื่น (ปกติ 1) . เมื่อจำนวนถึงค่าใน HISTSIZE หรือ 32767 (แล้วแต่จำนวนใดจะยิ่งใหญ่กว่า) เชลล์อาจล้อมหมายเลขเริ่มคำสั่งถัดไปด้วยจำนวนที่ต่ำกว่า (ปกติคือ 1) อย่างไรก็ตามแม้จะมีการห่อตัวเลขที่ไม่จำเป็น fc จะรักษาลำดับเวลาของคำสั่ง ตัวอย่างเช่นหากสี่คำสั่งตามลำดับจะได้รับหมายเลข 32 766, 32 767, 1 (ถูกล้อมรอบ)

[snip]

ซึ่งบอกเป็นนัยว่าคำสั่ง fc สามารถระบุรายการได้มากถึง 32767 รายการในไฟล์ประวัติทำให้มันยากสำหรับจำนวนคำสั่งที่เก็บไว้ในไฟล์ประวัติ แน่นอน YMMV แต่ฉันคิดว่าคุณสามารถศึกษาเอกสาร OS / หน้าคนของคุณในเรื่องนี้ ของฉัน 0.02 ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.