มีวิธีในการกำหนดประวัติที่ไม่ จำกัด ใน Bash หรือไม่?
มีวิธีในการกำหนดประวัติที่ไม่ จำกัด ใน Bash หรือไม่?
คำตอบ:
เพิ่มลงใน.bashrc
(Linux) หรือ.bash_profile
(MacOS) ของคุณ:
export HISTFILESIZE=
export HISTSIZE=
ไปแล้วประวัติไม่ จำกัด ขณะนี้ฉันมี 27,000 รายการ :)
จากman bash
:
หาก
HISTFILESIZE
ไม่ได้ตั้งค่าจะไม่มีการตัดทอน
นั่นหมายความว่า.bash_history
จะไม่ถูกตัดทอน
เช่นเดียวกันดูเหมือนว่าจะนำไปใช้HISTSIZE
แม้ว่าฉันไม่สามารถหาเอกสารที่
คุณสมบัติที่ประณีตอีกอย่างที่ฉันจะลองคือ:
หาก
HISTTIMEFORMAT
มีการตั้งค่าตัวแปรการประทับเวลาจะถูกเขียนไปยังไฟล์ประวัติทำเครื่องหมายด้วยตัวอักษรความคิดเห็นประวัติดังนั้นพวกเขาอาจจะถูกเก็บรักษาไว้ในช่วงเปลือกเช่นดังต่อไปนี้:
export HISTTIMEFORMAT="%F %T "
แจ้งให้เราทราบหากคุณได้ลองแล้ว ...
gdb
; หากคุณตั้งค่าHISTSIZE
ตัวแปรมันจะใช้เป็น 0 ดังนั้นจะเป็นการปิดใช้งานขนาดประวัติทั้งหมด
export
, HISTFILESIZE
อยู่ในจำนวนของสาย (ไม่ไบต์) และแฟ้มประวัติตัดทอนเกิดขึ้นเมื่อคุณตั้งค่าตัวแปร HISTFILESIZE
(และเมื่อออกจากเปลือก) ดังนั้นอย่าตั้งค่ามันสองครั้งในไฟล์ปรับแต่งของคุณด้วยค่าที่แตกต่างกัน ...
(โพสต์คำตอบของฉันใหม่จาก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 (ซึ่งจะใช้เวลานานนาน ) คุณจะไม่สังเกตเห็นผลกระทบใด ๆ
HISTFILESIZE
นี่คือเหตุผลที่คุณควรลบเหตุการณ์ที่เกิดขึ้นยกเว้นเหตุการณ์ที่คุณต้องการ มันจะถูกตัดทอนเมื่อมีการออกจากเชลล์ (แต่คาดว่าจะเป็นเช่นนั้น) export
และคุณก็ไม่ควรจะต้อง
bash --norc
จะตัดทอนประวัติอีกครั้ง
export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"
เพื่อเก็บประวัติเชลล์แยกต่างหากต่อเซสชัน (ขึ้นอยู่กับชื่อโฮสต์และชื่อ tty) แน่นอนฉันต้องสร้างไดเรกทอรี ~ / hist ก่อน
PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
รวมใน~ / .bashrc :
# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=
คำตอบนี้ตรงตามเกณฑ์ต่อไปนี้:
ประวัติต้นแบบแยกต่างหาก (ไม่มีเซสชันใดสามารถขัดจังหวะประวัติของคุณ)
การเขียนประวัติอัตโนมัติ (ไม่มีปุ่มลัด)
ไม่บ่อยนักเขียน (ไม่มีการต่อท้ายหลังจากแต่ละคำสั่ง)
ในการเริ่มต้นใช้งานแบบอินเทอร์แอคทีฟถ้า$HISTFILESIZE
ตั้งค่าเป็นตัวเลข bash $HISTFILE
จะตัดทอนหมายเลขนั้น เมื่อปิดการโต้ตอบและถ้าตัวเลือกเปลือกhistappend
มีการตั้งค่าทุบตีผนวก$HISTSIZE
สายที่จะมิฉะนั้นมันจะเขียนทับ$HISTFILE
$HISTFILE
ทุกครั้งที่มีการสร้างแท็บในเทอร์มินัล~/.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