การบันทึกประวัติทุบตีจาก Konsole หลายอันทำงานไม่ถูกต้อง


9

ฉันใช้เทอร์มินัล Konsole หลายอัน และฉันต้องการให้คำสั่งทั้งหมดที่ฉันพิมพ์ในทุก ๆ เทอร์มินัลถูกบันทึกไว้ในประวัติคำสั่งดังนั้น konsole ที่ฉันเปิดถัดไปจะมีทั้งหมด เพื่อป้องกันไม่ให้แต่ละเทอร์มินัลเขียนทับคำสั่งประวัติเทอร์มินัลอื่นฉันได้ตั้งค่าต่อไปนี้ใน.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

ฉันให้บรรทัดสุดท้ายเพื่อดูหมายเลขคำสั่งในพรอมต์ของฉัน หมายเลขคำสั่ง ไม่เคยไปเกิน 600 แต่ยังคงคำสั่งเก่าของฉันบางส่วนจะหายไปจากประวัติศาสตร์ มีหลายคำสั่งที่ให้ซ้ำ ๆ แต่ตามที่คาดไว้ignoredupsมันจะไม่เพิ่มคำสั่งในทันที แต่คำสั่งเก่ายังคงหายไปและจำนวนคำสั่งในประวัติศาสตร์จะยังคงอยู่มากกว่า 500 เล็กน้อย

.bash_historyไฟล์ดังกล่าวยังมีรายการที่ซ้ำซ้อนมากมายแม้จะถูกข้ามไป

PS: ผลลัพธ์ของเสียงสะท้อน$HISTSIZEและ$HISTFILESIZEทั้งคู่=1000


ปรับปรุง: .bashrcฉันพบปัญหาในรายการดังกล่าวข้างต้นไป เพียงแค่โทรhistory -aในPROMPT_COMMANDเพียงผนวกคำสั่งใหม่ที่ผ่านมาเพื่อ .bash_history ดังนั้นignoredupsและerasedupsไม่มีผลกระทบ

มีวิธีใดบ้างฉันยังสามารถเขียนถึง. bash_history โดยไม่ซ้ำกันจากทุกเทอร์มินัล ฉันไม่ต้องการโหลดประวัติทั้งหมดที่แต่ละคำสั่งพร้อมรับคำสั่งhistory -rและเขียนกลับมาอีกครั้งhistory -wเพราะคำสั่งที่ฉันใช้ในเทอร์มินัลหนึ่งจะปรากฏในเทอร์มินัลที่ทำงานแบบขนานอื่นเช่นกัน ฉันต้องการให้คำสั่งแบบรวมปรากฏในเทอร์มินัลใหม่เท่านั้น

ปริศนาทำไมประวัติของฉันถึงถูกตัดเหลือ 500 ถูกแก้ไข ฉันสังเกตว่ามันเกิดขึ้นทุกครั้งที่ฉันใส่เครื่องนี้ การสร้าง.bash_profileรายการต่อไปนี้สามารถแก้ไขปัญหานี้ได้

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

ตอนนี้. bashrc ของฉันจะถูกดำเนินการในแต่ละครั้งที่ฉันมี และขนาดไฟล์ประวัตินั้นเพิ่มขึ้นแบบ monotonically


นี่คือสิ่งที่คุณเป็นหรือไม่ unix.stackexchange.com/questions/1288/…
jasonwryan

ไม่ฉันต้องการหลีกเลี่ยงข้อกำหนดที่สองในรายการของ Oli ฉันไม่ต้องการให้ประวัติเทอร์มินัลต่าง ๆ ของฉันสับสน จนกว่าฉันจะเริ่มต้นสถานีใหม่ นี่คือสิ่งที่เกิดขึ้นตามธรรมชาติเมื่อฉันปิดเครื่องอย่างถูกต้อง แต่บางครั้งการปิดเครื่องที่เหมาะสมนั้นเป็นไปไม่ได้และหากฉันไม่บันทึกประวัติในทันทีทันใดทุกอย่างจะหายไปในทันทีเมื่อปิดเครื่อง
indiajoe

ฟังดูคล้ายกับคำถามที่มาในbug-bashรายชื่อผู้รับจดหมายหนึ่งปีหลังจากที่โพสต์คำถามนี้: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
syntaxerror

คำตอบ:


1

ฉันได้ข้อสรุปว่ามันเป็นไปไม่ได้ที่จะผนวกคำสั่งใหม่โดยตรงและในเวลาเดียวกันเพื่อลบรายการที่ซ้ำกัน ดังนั้นทางออกของฉันคือเรียกใช้คำสั่งต่อไปนี้ในขณะที่ หรือจะวางไว้ใน crontab ของฉัน

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

คำสั่งดังกล่าวจะเก็บคำสั่งสุดท้ายที่เกิดขึ้นและลบซ้ำ ๆ ทุกครั้งที่อยู่เหนือมันจากไฟล์ประวัติโดยไม่ต้องทำให้คำสั่ง


0

มันน่าเกลียดและฉันแน่ใจว่าsedหรือawkจะดีกว่า แต่ผมพยายามที่จะแก้ไขปัญหาเดียวกันโดยการเพิ่มในของฉัน.bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

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

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