วิธีการ: ประวัติ Bash / shell ไม่ จำกัด


คำตอบ:


82

เพิ่มลงใน.bashrc(Linux) หรือ.bash_profile(MacOS) ของคุณ:

export HISTFILESIZE=
export HISTSIZE=

ไปแล้วประวัติไม่ จำกัด ขณะนี้ฉันมี 27,000 รายการ :)

จากman bash:

หากHISTFILESIZEไม่ได้ตั้งค่าจะไม่มีการตัดทอน

นั่นหมายความว่า.bash_historyจะไม่ถูกตัดทอน

เช่นเดียวกันดูเหมือนว่าจะนำไปใช้HISTSIZEแม้ว่าฉันไม่สามารถหาเอกสารที่

คุณสมบัติที่ประณีตอีกอย่างที่ฉันจะลองคือ:

หากHISTTIMEFORMATมีการตั้งค่าตัวแปรการประทับเวลาจะถูกเขียนไปยังไฟล์ประวัติทำเครื่องหมายด้วยตัวอักษรความคิดเห็นประวัติดังนั้นพวกเขาอาจจะถูกเก็บรักษาไว้ในช่วงเปลือกเช่นดังต่อไปนี้:

export HISTTIMEFORMAT="%F %T "

แจ้งให้เราทราบหากคุณได้ลองแล้ว ...


3
สิ่งนี้ใช้ไม่ได้กับหลายกรณีและประวัติทุบตียังคงถูกตัดทอน ดูคำตอบของฉันด้านล่างสำหรับโซลูชันที่สมบูรณ์ยิ่งขึ้น
fotinakis

2
คำเตือน: ทำให้เกิดอาการปวดหัวด้วยgdb; หากคุณตั้งค่าHISTSIZEตัวแปรมันจะใช้เป็น 0 ดังนั้นจะเป็นการปิดใช้งานขนาดประวัติทั้งหมด
Matteo Italia

2
บันทึก: คุณไม่จำเป็นต้องexport, HISTFILESIZEอยู่ในจำนวนของสาย (ไม่ไบต์) และแฟ้มประวัติตัดทอนเกิดขึ้นเมื่อคุณตั้งค่าตัวแปร HISTFILESIZE (และเมื่อออกจากเปลือก) ดังนั้นอย่าตั้งค่ามันสองครั้งในไฟล์ปรับแต่งของคุณด้วยค่าที่แตกต่างกัน ...
vaab

@vaab: ถ้าฉันไม่ส่งออก HISTFILE ฉันไม่เห็นฮิสไฟล์ของฉันที่ใช้ "echo $ HISTFILE" ใน subshells ดังนั้นในขณะที่มันไม่จำเป็นมันจะมีประโยชน์และไม่เป็นอันตรายใด ๆ ที่ฉันสามารถตรวจพบได้
Jeff Learman

41

(โพสต์คำตอบของฉันใหม่จากhttps://stackoverflow.com/a/19533853/128597 )

หลังจากการทำซ้ำขนาดใหญ่น่าเกลียดและคดีขอบแปลก ๆ ในช่วงหลายปีที่ผ่านมาตอนนี้ฉันมีส่วนที่กระชับของ. bashrc ของฉันที่อุทิศให้กับสิ่งนี้

ก่อนอื่นคุณต้องแสดงความคิดเห็นหรือลบส่วนนี้ของ. bashrc ของคุณ (ค่าเริ่มต้นสำหรับ Ubuntu) หากคุณไม่ทำเช่นนั้นสภาพแวดล้อมบางอย่าง (เช่นscreenเซสชันที่กำลังทำงาน) จะยังคงตัดทอนประวัติของคุณ:

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

ประการที่สองเพิ่มส่วนนี้ลงที่ด้านล่างของ. bashrc ของคุณ:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

หมายเหตุ: ทุกคำสั่งจะถูกเขียนทันทีหลังจากที่เรียกใช้ดังนั้นหากคุณวางรหัสผ่านโดยไม่ได้ตั้งใจคุณไม่สามารถเพียงแค่ "kill -9 %%" เพื่อหลีกเลี่ยงการเขียนประวัติคุณจะต้องลบมันออกด้วยตนเอง

นอกจากนี้โปรดทราบว่าแต่ละเซสชัน bash จะโหลดไฟล์ประวัติแบบเต็มในหน่วยความจำ แต่แม้ว่าไฟล์ประวัติของคุณจะเพิ่มขึ้นเป็น 10MB (ซึ่งจะใช้เวลานานนาน ) คุณจะไม่สังเกตเห็นผลกระทบใด ๆ


4
ไฟล์ประวัติจะถูกตัดทอนเมื่อคุณตั้งค่าHISTFILESIZEนี่คือเหตุผลที่คุณควรลบเหตุการณ์ที่เกิดขึ้นยกเว้นเหตุการณ์ที่คุณต้องการ มันจะถูกตัดทอนเมื่อมีการออกจากเชลล์ (แต่คาดว่าจะเป็นเช่นนั้น) exportและคุณก็ไม่ควรจะต้อง
vaab

3
@vaab หากคุณไม่ส่งออกการทำสิ่งที่ชอบbash --norcจะตัดทอนประวัติอีกครั้ง
Yongwei Wu

1
ฉันใช้export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"เพื่อเก็บประวัติเชลล์แยกต่างหากต่อเซสชัน (ขึ้นอยู่กับชื่อโฮสต์และชื่อ tty) แน่นอนฉันต้องสร้างไดเรกทอรี ~ / hist ก่อน
Jeff Learman

2
หมายเหตุคุณอาจต้องการตรวจสอบค่าของ PROMPT_COMMAND และไม่ผนวกสิ่งนี้ซ้ำ ๆ อย่างสุ่ม ๆ เพราะมันจะทำสิ่งที่บ้าคลั่งต่อระบบของคุณ การตรวจสอบค่า Null หรือดีกว่าการค้นหาการขยายตัวแปรเชลล์อาจปลอดภัยกว่า
dragon788

3
ฉันใช้สิ่งนี้เพื่อหลีกเลี่ยงปัญหา @ dragon788 ที่อ้างถึง:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg

9

รวมใน~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

คำตอบนี้ตรงตามเกณฑ์ต่อไปนี้:

  1. ประวัติต้นแบบแยกต่างหาก (ไม่มีเซสชันใดสามารถขัดจังหวะประวัติของคุณ)

  2. การเขียนประวัติอัตโนมัติ (ไม่มีปุ่มลัด)

  3. ไม่บ่อยนักเขียน (ไม่มีการต่อท้ายหลังจากแต่ละคำสั่ง)

พื้นหลัง

ในการเริ่มต้นใช้งานแบบอินเทอร์แอคทีฟถ้า$HISTFILESIZEตั้งค่าเป็นตัวเลข bash $HISTFILEจะตัดทอนหมายเลขนั้น เมื่อปิดการโต้ตอบและถ้าตัวเลือกเปลือกhistappendมีการตั้งค่าทุบตีผนวก$HISTSIZEสายที่จะมิฉะนั้นมันจะเขียนทับ$HISTFILE$HISTFILE

เคล็ดลับสำหรับ OSX (เทอร์มินัล)

ทุกครั้งที่มีการสร้างแท็บในเทอร์มินัล~/.bash_profileอ่านซึ่งหมายความว่า bash จะไม่อ่าน~/.bashrcต่อไป เพิ่มบรรทัดต่อไปนี้ใน~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

เคล็ดลับสำหรับหน้าจอ

หากคุณใช้หน้าจอไฟล์กำหนดค่าของคุณคือ ~ / .screenrc หากคุณต้องการให้หน้าจอบันทึกประวัติคุณเพียงแค่ตั้งค่าให้ใช้เชลล์ล็อกอินซึ่งจะเป็นแหล่งไฟล์เริ่มต้น bash ของคุณ (และบันทึกประวัติของคุณ)

# use bash, make it a login shell
defshell -bash

3

แนวคิดที่แตกต่างกัน (อาจจะไม่บังคับ) แต่คุณสามารถมีunlimitedประวัติศาสตร์เมื่อใช้เปลือกอ่างล้างจาน

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