Bash history loss เมื่อใช้ histappend


18

ผมชอบที่จะให้จำนวนมากของประวัติศาสตร์ดังนั้นฉันได้ตั้งอยู่ในของฉันhistappend .bashrcเวลาส่วนใหญ่ทุกอย่างทำงานได้ดีโดยมีประวัติที่สร้างขึ้นจากกระสุนจำนวนมากที่ต่อท้าย อย่างไรก็ตามทุกครั้งที่ฉันจะเริ่มเปลือกใหม่และพบว่าฉันได้สูญเสียประวัติทั้งหมด - และมันมักจะมีเพียงคำสั่งบางส่วนจากเปลือกสุดท้ายเพื่อออก (เช่นมันไม่ใช่แค่เขียนทับแทนการผนวก ) ด้วยเหตุนี้ฉันจึงสงสัยว่ามันเกิดขึ้นที่ shell exit แทนที่จะเป็นกระบวนการอื่นที่ฆ่า.bash_historyไฟล์ สนับสนุนข้อสรุปนี้ฉันมีหมายเลขคำสั่งประวัติในพรอมต์ของฉันและฉันไม่เคยเห็นพวกเขากระโดดลงมา

ใครเคยเจอปัญหาที่คล้ายกัน? หรือแม้กระทั่งเพียงแค่มีข้อเสนอแนะวิธีติดตามปัญหา?


คำตอบ:


13

ขออภัยที่จะตอบคำถามของฉันเอง แต่ไม่มีคำตอบอื่นใดที่แก้ปัญหาได้

ในที่สุดฉันก็พบว่าสิ่งนี้จะเกิดขึ้นเฉพาะเมื่อปิดgnome-terminalตัวเอง (เช่นไฟล์> ออกจากปุ่ม 'x', alt + F4) และโดยทั่วไปแล้วเมื่อปิดเทอร์มินัลหลายเครื่องอย่างรวดเร็ว มันไม่เคยเกิดขึ้นเมื่อใช้ ctrl-D เพื่อปิดเชลล์ปล่อยให้เครื่องติดตาม

หากฉันสามารถตรึงมันได้ดีพอฉันจะยื่นรายงานข้อผิดพลาดของ gnome-terminal ในระหว่างนี้อาจช่วยคนอื่นที่มาจาก google!


10

ไม่มีความคิดว่าทำไมสิ่งนี้ถึงเกิดขึ้น แต่บางทีคุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยการบังคับให้ bash เขียนไฟล์ประวัติทุกครั้งที่มีข้อความแจ้ง:

PROMPT_COMMAND="history -a; history -n"

สิ่งนี้จะเขียน (-a) จากนั้นอ่านอีกครั้ง (-n) ไฟล์ประวัติทุกครั้งที่ bash พรอมต์สำหรับคำสั่งถัดไป สิทธิประโยชน์เพิ่มเติม: คุณจะได้รับคำสั่ง X ในเชลล์ 1 ในประวัติของเชลล์ 2


ใช้งานไม่ได้กับ GNU bash รุ่น 3.00.15 (1) - ปล่อย (i686-redhat-linux-gnu)
David Mackintosh

2
คุณช่วยอธิบายว่า "ไม่ทำงาน" หมายถึงอะไร
innaM

3
ประโยชน์เพิ่มเติมที่คุณอ้างถึงคือข้อเสีย มันไม่ใช่พฤติกรรมที่ฉันกำลังมองหาเพราะฉันอาจจะทำภารกิจสองอย่างแยกกันโดยสิ้นเชิงในกระสุนแยกต่างหากและไม่ต้องการผสมผสานประวัติศาสตร์ของพวกเขา สิ่งนี้จะไม่ช่วยอะไรเลย เมื่อประวัติหายไปมันกำลังลบเนื้อหาของ. bash_history - ฉันไม่คิดว่ามันจะสำคัญว่าพวกเขาจะถูกเขียนที่ shell exit หรือโดย PROMPT_COMMAND
Cascabel

5
history -nเป็นขุย history -a; history -c; history -rมันน่าเชื่อถือมากขึ้นที่จะทำ เพื่ออธิบายสิ่งนี้ฉันจะทราบก่อนว่าhistory -aสิ่งที่ถูกต้อง - คุณ.bash_historyจะมีคำสั่งทั้งหมดที่คุณพิมพ์ตามลำดับที่คุณพิมพ์พวกเขา - สมมติว่าคุณทำงานhistory -aหลังจากทุกคำสั่ง ความท้าทายคือการทำให้แนวคิดของเชลล์เกี่ยวกับประวัติสอดคล้องกับไฟล์. bash_history นี่เป็นเรื่องง่ายด้วย-cและ-rปัญหาคือมันอาจช้าถ้ามันใหญ่ -nสามารถแยกได้เนื่องจากระบุว่าบรรทัดใดไม่ถูกต้อง (ฉันไม่มีพื้นที่เหลืออยู่ที่นี่!)
Aaron McDaid

4
( ... ถ้าคุณใช้-n) ลองนึกภาพคุณรันคำสั่งในเปลือก ls1: cdจากนั้นในเปลือกอีกเชลล์สองคุณรัน ตอนนี้ในประวัติศาสตร์ .bash_history ถูกต้องเพราะhistory -aในของคุณPROMPT_COMMAND- ls \n cd \nมันจะมี pwdถัดไปคุณกลับไปยังเปลือกหนึ่งและประเภท Shell One คิดว่ามีเพียงคำสั่ง n ประวัติ ( ls) ตอนนี้มันคิดว่ามีสองคำสั่ง ( lsและpwd) ในประวัติศาสตร์ เมื่อคุณ-nคิด (ฉันมีสองคำสั่งในประวัติศาสตร์ของฉันและมีสองคำสั่งใน. bash_history ดังนั้นฉันถึงวันที่)
Aaron McDaid

3

ประสบการณ์ของฉันคือเปลือกหอยอัปเดตไฟล์ประวัติเมื่อถึงเวลาออก ดังนั้น "ประวัติ" เริ่มต้นของเชลล์จึงขึ้นอยู่กับมุมมองของเชลล์ที่ออกมาล่าสุด

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


2
ผมเข้าใจเป็นอย่างดีว่าแฟ้มประวัติที่เขียน - histappendนี่คือเหตุผลที่ผมระบุไว้ในคำถามของฉันที่ฉันใช้ ปัญหาไม่ใช่เนื้อหาที่ไม่คาดคิด แต่เป็นการสูญเสียเนื้อหาที่จัดเก็บไว้ก่อนหน้านี้ทั้งหมด
Cascabel

สิ่งนี้อธิบายได้ว่าทำไมฉันถึงเสียประวัติ ...
B เซเว่น

1

ฉันเคยเห็นสิ่งนี้เกิดขึ้นมาก่อน แต่มันก็มีปัญหากับข้อผิดพลาดของดิสก์ที่เกิดขึ้นในความถี่ที่เพิ่มขึ้น ฉันจะเรียกใช้การสแกนบนไดรฟ์ หากปรากฎว่าไดรฟ์ใช้ได้ฉันจะตรวจสอบว่าไฟล์นี้ไม่เกินขีด จำกัด ประวัติเชลล์โดยพลการหรือไม่

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


ฉันไม่สามารถเข้าถึงรูทบนเครื่องที่เกิดขึ้นได้ แต่ฉันค่อนข้างมั่นใจว่าไดรฟ์นั้นใช้ได้ โฮมไดเร็กตอรี่ของฉันถูกเก็บไว้บนเซิร์ฟเวอร์ในแล็บของเรา (RAID มากมาย, ฉันเชื่อว่า) และติดตั้ง nfs คุณหมายถึงอะไรโดย "ขีด จำกัด ประวัติเชลล์โดยพลการ" ทั้งหมดนี้เกิดขึ้นได้ดีกว่า HISTSIZE และ HISTFILESIZE และแม้ว่าฉันจะมีขนาดใหญ่ แต่ก็ต่ำกว่าintทุบตีที่เก็บไว้
Cascabel

ฉันต้องบอกว่ารายการของ David Mackintosh อาจเป็นสิ่งที่เกิดขึ้น
Axxmasterr

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