จัดการประวัติทุบตีด้วยเทอร์มินัลหลายเครื่อง


110

ฉันใช้ Terminator เป็นส่วนใหญ่และโดยปกติจะเปิดด้วยหน้าต่างเทอร์มินัลแบบแยก 3 ตัว ฉันใช้เทอร์มินัล Gnome ด้วยเหตุผลหลายประการ
ฉันสงสัยว่าประวัติทุบตีจัดการอย่างไรในกรณีนี้เพราะบางครั้งฉันพลาดคำสั่งที่ออกมาก่อนหน้านี้เมื่อฉันเรียกใช้history

ตัวอย่างเช่นพรอมต์ของฉันแสดงบรรทัดประวัติทุบตีปัจจุบัน ( \!) และถ้าฉันเปิดใช้งานเทอร์มิเนเตอร์โดยมีหน้าต่างเทอร์มินัลแยก 3 ตัวฉันจะได้รับประวัติบรรทัดเดียว (สมมุติ 100) บนเทอร์มินัลทั้งหมด ประวัติใดจะถูกบันทึกไว้?

อีกทั้งการเปิดตัว Gnome Terminal หลังจากใช้งาน Terminator ฉันได้รับสาย 100 เมื่อเริ่มต้นโดยไม่คำนึงถึงคำสั่งทั้งหมดที่ออกมาก่อนหน้านี้ใน Terminator


คำตอบ:


107

เซสชัน bash ที่บันทึกไว้เป็นเซสชันสำหรับเทอร์มินัลที่ปิดล่าสุด หากคุณต้องการที่จะบันทึกคำสั่งทุกครั้งที่คุณสามารถใช้เคล็ดลับที่อธิบายไว้ที่นี่

export PROMPT_COMMAND='history -a'

เพื่ออ้างอิง manpage:“ ถ้าตั้งค่าจะถูกดำเนินการเป็นคำสั่งก่อนที่จะออกพรอมต์หลักแต่ละอัน”

ดังนั้นทุกครั้งที่คำสั่งของฉันเสร็จสิ้นมันจะผนวกรายการประวัติที่ไม่ได้เขียนไว้~/.bash_historyก่อนที่จะแสดงพรอมต์ (เพียง $ PS1) อีกครั้ง

ดังนั้นหลังจากที่วางสายไว้ในนั้น/etc/bash.bashrcฉันไม่ต้องพบว่าตัวเองพลิกโฉมล้อหรือเสียเวลาอันมีค่าไปกับการพิมพ์สิ่งใหม่เพียงเพราะฉันขี้เกียจกับเครื่องเทอร์มินัลของฉัน

อย่างไรก็ตามคุณจะต้องคำนึงถึงว่าคำสั่งจากเซสชันต่าง ๆ จะถูกผสมในไฟล์ประวัติของคุณดังนั้นมันจะไม่ตรงไปตรงมาเพื่ออ่านในภายหลัง

ดูสิ่งนี้ด้วย:


ไม่จัดเก็บแยกต่างหากสำหรับ TTL ที่แตกต่างกัน ??
Vineet Menon

ยอดเยี่ยม ขอบคุณสำหรับคำอธิบายและการแก้ปัญหา ฉันลองด้วยexport PROMPT_COMMAND='history -a; history -r'และฉันได้รับหมายเลขบรรทัดประวัติแปลก ๆ ในเทอร์มินัล - หลังจากออกหมายเลขบรรทัดคำสั่งประวัติกระโดดโดย 2000 แทน 1 ซึ่งแปลก แต่มันทำงานตามที่กล่าว - บันทึกเทอร์มินัลทั้งหมด
zetah

@VineetMenon สำหรับรายละเอียดเพิ่มเติมดูที่นี่ ส่วนที่น่าสนใจ: เมื่อเชลล์เริ่มทำงานประวัติจะเริ่มต้นจากไฟล์ที่ตั้งชื่อโดยตัวแปร HISTFILE (ค่าเริ่มต้น `~ / .bash_history ') [... ] เมื่อเชลล์เชิงโต้ตอบออกจากบรรทัด $ HISTSIZE สุดท้ายจะถูกคัดลอกจากรายการประวัติไปยังไฟล์ที่มีชื่อโดย $ HISTFILE
jcollado

เว็บไซต์นี้ดูเหมือนว่าลง: northernmost.org/blog/flush-bash_history-after-each-command
Shubham


32

หลังจากอ่านหลายครั้งman bashฉันจะใช้ไฟล์ประวัติแยกต่างหากสำหรับแต่ละเชลล์ ฉันได้mkdir -m 0700 ~/.historyเพิ่มแล้ว

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

~/.bashrcของฉัน ทุกครั้งที่ผ่านมาฉันจำได้du -sk .historyและทำความสะอาด เป็นเรื่องดีที่มีทุกคำสั่งที่ฉันพิมพ์ไว้สำหรับฉัน

ฉันใช้ข้างต้นเพื่อดูว่าฉันทำอะไรมาสาย:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
หรือ
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(เพื่อรวมอาร์กิวเมนต์ที่ 1 เช่นsudo mountในการเรียงลำดับ)


3
ทำไมคุณถึงมอบหมายHISTFILESIZEสองครั้ง
Daniel

2
โดยการตั้งค่า HISTFILESIZE เป็น 0 ฉันจะล้างบัฟเฟอร์ประวัติและรีเซ็ตกลไกการบันทึกประวัติ จากนั้นฉันจะตั้งค่าขนาดที่ฉันต้องการและเริ่มบันทึกประวัติใน HISTFILE man bashดูส่วนประวัติศาสตร์ของ
waltinator

1
มีวิธีการรวมไฟล์ประวัติเพื่อCtrl+rทำงานอีกครั้งหรือไม่
n611x007

3
นี่ควรเป็นคำถามใหม่ แต่ฉันไม่คิดว่ามันเป็นความคิดที่ดี ฉันใช้egrep 'whatever' .history/*(หรือcat .history/* | egrep 'whatever') แทนและใช้ Ctrl-r เพื่อค้นหาประวัติของแต่ละเซสชัน อ่านman bash-builtinsเกี่ยวกับคำสั่งประวัติ sort .history/* | uniq -c | sort -n | wc -lคำสั่งที่ไม่ซ้ำกันของฉันแสดง 16033 cut '-d ' -f1 .history/* | sort | uniq -c | sort -nแสดงคำสั่งที่ไม่ซ้ำกัน 2004 ส่วนใหญ่พิมพ์ผิด การโหลดทั้งหมดที่อยู่ใน "รายการประวัติ" ของ bash จะไม่ช่วย
waltinator

@ altinator - ฉันรู้ว่านี่เป็นความคิดเห็นเก่า แต่คุณหมายถึงว่าการตั้งค่าตัวแปรสภาพแวดล้อมอย่างใดก่อให้เกิดการกระทำทันทีหรือไม่ กระบวนการใดที่จะรับข้อเท็จจริงที่คุณกำหนดค่าเป็น 0 ถึง HISTFILESIZE ในเชลล์ท้องถิ่นแล้วเปลี่ยนเป็น 4096 ทันที นี่เป็นสิ่งที่ไม่มีเอกสารเกี่ยวกับการจัดการชื่อตัวแปรบางอย่างของ bash หรือไม่
ไนซ์

8

วิธีแสดงhistoryจากเทอร์มินัลทั้งหมด:

เพิ่มexport PROMPT_COMMAND='history -a; history -r'ลงในไฟล์. bashrc ของคุณ

ที่มา: http://northernmost.org/blog/flush-bash_history-after-each-command



3
ฉันจะบอกว่าหลังจากสองสามเดือนของการใช้สิ่งนี้ในที่สุดฉันก็แสดงความคิดเห็นเมื่อเร็ว ๆ นี้ มันเป็น bittersweet เพราะฉันไม่ต้องการลอดผ่านคำสั่ง 100 ครั้งล่าสุดเพียงเพื่อเรียกใช้คำสั่งที่ฉันเคยเรียกใช้ในบานหน้าต่าง Tmux ในบางครั้งฉันอาจมีคำสั่งบันทึกเฉพาะซึ่งฉันต้องรีสตาร์ท
Elijah Lynn

history --mergeวิธีการแก้ปัญหาที่ดีที่เปลือกปลามีเป็น ฉันได้ใช้สิ่งนี้มาประมาณหนึ่งปีแล้วและมันแก้ปัญหาได้ เมื่อฉันต้องการประวัติล่าสุดจากเซสชันอื่นฉันเพิ่งรันคำสั่งนั้นและพร้อมให้ฉันใช้งานทันที
Elijah Lynn

ไม่จำเป็นต้องส่งออก
การชดเชย จำกัด

6

ดูเพิ่มเติมที่ " การรักษาประวัติถาวรในการทุบตี " เพื่อเป็นทางเลือกอื่น มันพร้อมท์ให้คุณส่งคำสั่งทั้งหมดที่เคยพิมพ์ลงในเทอร์มินัลใด ๆลงในไฟล์ "ประวัติถาวร" (ควบคู่ไปกับสิ่งที่ทำตามปกติสำหรับปกติ.history)


1
ฉันแทรก$$เพื่อสร้างบรรทัดecho $$ $date_part "$command_part" >> ~/.persistent_historyคำนำหน้ารายการนี้มี PID ของกระบวนการทุบตีของพวกเขาเพื่อให้เราสามารถแยกประวัติศาสตร์หลาย ๆ
Evgeni Sergeev

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