เป็นไปได้ไหมที่จะเขียนถึง. bash_history ทันที?


124

ฉันมักจะเปิดจำนวนมากและจำนวนขั้ว [ตอนนี้ผมมี 7 เปิดให้บริการในพื้นที่ทำงานนี้] และฉันมักจะค้นหาhistoryด้วยgrepที่จะหาคำสั่งฉันได้เขียนเพียงเมื่อเร็ว ๆ นี้ แต่ฉันไม่ต้องการที่จะลงล่าขั้วแล้วเลื่อนขึ้น และตามล่ามันให้มากขึ้น ฯลฯ บางครั้งเทอร์มินัลของฉันก็ปิดโดยไม่มี 'ทางออก' และทุกอย่างที่ฉันเขียนหายไป

ดังนั้นมีวิธีที่จะทำให้มันแต่ละขั้วเขียนถึง. bash_history ทันทีหรือไม่ หรืออย่างน้อยหนึ่งนาทีหรืออะไรอย่างนั้น


2
โดยปกติฉันใช้control-rเพื่อค้นหาแบบย้อนกลับในประวัติคำสั่งของหนึ่ง bash สะดวกกว่าhistory | grepนอกจากคุณต้องมี regex
Peter Cordes

คำตอบ:


92

วิธีง่ายๆตามรายละเอียดในการปรับปรุงทุบตีในเรียลไทม์

มันบอกว่าจะใส่คำสั่งเหล่านั้นใน. bashrc config:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

คำสั่งแรกเปลี่ยน.historyโหมดไฟล์เพื่อผนวก และครั้งที่สองกำหนดค่าhistory -aคำสั่งที่จะรันที่แต่ละ shell prompt -aทันทีเขียนเส้นปัจจุบัน / ใหม่ในการแฟ้มประวัติ

เกี่ยวข้องกับ zsh:


1
งานประเภทนี้ดี ฉันลองทดสอบเพิ่มเติมและดูเหมือนว่าจะใช้ได้เฉพาะกับคำสั่งแรกเท่านั้น มันทำงานอย่างถูกต้องสำหรับคุณ?
แมตต์

54

ลองใส่สิ่งนี้ลงใน.bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

เครดิตที่นี่: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cล้างประวัติของเซสชันที่ทำงานอยู่ $HISTSIZEนี้จะช่วยลดเคาน์เตอร์ประวัติศาสตร์ตามจำนวนของ history -rอ่านเนื้อหาของ$HISTFILEและแทรกไว้ในประวัติการใช้งานปัจจุบัน $HISTFILEนี้จะยกเคาน์เตอร์ประวัติศาสตร์ตามจำนวนของสายใน

ฉันคิดว่ามันหมายความว่าคำสั่งจะพร้อมใช้งานเกือบจะทันที (คุณมีหนึ่งเทอร์มินัลเขียนecho 1เทอร์มินัลที่สองecho 2ก่อนecho 3และเมื่อกดลูกศรลงสองครั้งคุณควรจะecho 2ใช้ได้คุณต้องออกคำสั่งในเทอร์มินัลที่กำหนด ถูกเขียน


ยอดเยี่ยม! ขอบคุณ สงสัยว่าทำไมตัวเลือกเหล่านั้นถึงไม่ได้บันทึกไว้ในman history...
artfulrobot

10
@artfulrobot: คำสั่งนี้เป็นในตัวจึงเป็นสิ่งที่อธิบายไว้ในbash นอกจากนี้คุณยังสามารถใช้man bash help history
pabouk

2
ฉันได้กำหนดค่า zsh ให้ทำงานเช่นนี้: แต่ละเชลล์ติดตามประวัติของตัวเอง (และก่อนหน้านั้นประวัติรวม) และทุกคำสั่งจะถูกผนวกเข้ากับประวัติรวม สิ่งนี้แตกต่างและดีกว่าการโหลดประวัติทุกคำสั่งสำหรับทุกเชลล์เพราะฉันมักจะมี "thread of work" หรือ "job" ที่แตกต่างกันสำหรับแต่ละเชลล์เทอร์มินัล ผมคิดว่าเป็นความแตกต่างระหว่างนี้ด้วย-rและเทียบกับเพียงแค่มี-c -a
สตีเวนลู

แล้วคุณใช้อะไรกันแน่ history -c; history -r? ฉันเดาว่ามันจะดีกว่าสำหรับคุณมันจะดีกว่าสำหรับฉันในบางครั้งเท่านั้นฉันมักจะใช้เปลือกหอยหลายอันในการทำงานหนึ่งครั้งดังนั้นฉันจึงอยากให้มีประวัติรวมกันมากที่สุด ฉันคิดว่าคำสั่งถูกเขียนลงในประวัติหลังจากเสร็จสิ้นเท่านั้น โดยทั่วไปเมื่อฉันเริ่มเซสชัน ssh ไปที่โฮสต์หนึ่งและต้องการเปิดอีกอันในขณะที่เซสชันแรกยังคงทำงานอยู่ฉันต้องพิมพ์อีกครั้งเพราะยังไม่ได้เขียนถึงประวัติ
sup

ฉันคิดว่าฉันไม่เคยติดอยู่นานพอที่จะคิดออกวิธีทุบตีพร้อม ๆ กันติดตามเธรดแบบขนานของประวัติศาสตร์ (ต่อเชลล์อินสแตนซ์พื้นฐาน) ในขณะที่เขียนประวัติลงในไฟล์ประวัติหลักทันที Zsh ทำให้ง่ายขึ้นมากนอกจากนี้ฉันยังได้กำหนดฟังก์ชั่น zsh เพื่อเขียนข้อมูลเมตาแฟนซีจำนวนมากไปยังไฟล์ปรับปรุงประวัติของการวางแผนของฉัน มันค่อนข้างขาดไม่ได้เลยทีเดียว อย่างไรก็ตามกลไกที่มี precmd () และ preexec () สำหรับ zsh รับส่ง args อธิบายคำสั่งที่ป้อน จากนั้นจะกลายเป็นเรื่องเล็กน้อยที่จะนำไปสู่ไฟล์ต่างๆ history -aอาจพอเพียง
Steven Lu

38

ฉันมีไฟล์ประวัติขนาดใหญ่ที่มีรายการประมาณ 100,000 รายการและตัวแปรที่ล้างรายการประวัติและอ่านไฟล์ประวัติทั้งหมด (โดยใช้history -cและhistory -r) แนะนำการหน่วงเวลาที่เห็นได้ชัดเจน (อาจ 0.2 วินาที) ก่อนที่จะมีข้อความแจ้งปรากฏขึ้น การใช้history -nเพื่อให้มีการอ่านเฉพาะบรรทัดใหม่จากไฟล์ประวัติเท่านั้น:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND ไม่ต้องส่งออกเนื่องจากเป็นตัวแปรเชลล์


ยอดเยี่ยม! ไม่มีประวัติสูญหายอีกต่อไปเมื่อการเชื่อมต่อลดลง!
Tobia

มันวิเศษมาก ด้วยการต่อท้ายไฟล์และการอ่านจากไฟล์มันจะแชร์ประวัติข้ามเทอร์มินัลหลายเครื่อง
wisbucky

3

หมายเหตุสำหรับคำตอบอื่น ๆ ทั้งหมด (ซึ่งโดยพื้นฐานแล้วเป็นสิ่งเดียวกัน):

การตั้งค่าPROMPT_COMMAND="history -a;$PROMPT_COMMAND"ใน.bashrc(หรือเพื่อน) ก็เพียงพอ

นอกจากนี้คุณยังสามารถเรียกใช้ด้วยตนเองhistory -aเมื่อใดก็ตามที่คุณต้องการ "ถ่ายภาพ" ประวัติในเซสชั่นปัจจุบัน

shopt -s histappendไม่จำเป็นต้องใช้คำสั่งเนื่องจากต่อhistory -aท้ายบรรทัดใหม่เข้ากับไฟล์และไม่เขียนทับมันเสมอ นอกจากนี้อย่างน้อยที่สุดของ Bash 4 histappendก็เป็นพฤติกรรมเริ่มต้น


เมื่อวันที่ 10.13.6 shopt -s histappendแม็คของฉันมันดูเหมือนมันไม่ได้ทำงานโดยไม่ต้อง โปรดทราบว่าฉันเพิ่มลงในของฉันด้วย~/.bash_profile
ubershmekel

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