บางครั้งคำสั่งประวัติจะไม่ถูกเก็บไว้ใน. bash_history


20

ฉันออกคำสั่งมากมายเมื่อวานนี้ใน CentOS 7 ของฉัน แต่เมื่อฉันต้องการเรียกคำสั่งเหล่านี้วันนี้ฉันพบว่าไม่มีบันทึกใด ๆ เมื่อฉันเปิดไฟล์.bash_historyฉันยังไม่พบคำสั่งที่ฉันใช้เมื่อวานนี้ แต่ฉันพบคำสั่งเก่า ๆ หลายครั้งเมื่อไม่กี่วันที่ผ่านมา เหตุใดคำสั่งล่าสุดจึงไม่ถูกจัดเก็บ ฉันจะเพิ่มความสามารถด้านประวัติศาสตร์ได้อย่างไร?


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

คำตอบ:


11

สาเหตุที่เป็นไปได้มากที่สุดสำหรับไอเท็มประวัติที่ไม่แสดงไม่ได้เกิดจากการตั้งค่าHISTFILEเป็นอะไรหรือHISTSIZEเป็นศูนย์โดยการเข้าสู่เครื่องเดียวกันสองครั้งและออกจากอินสแตนซ์ bash ที่สอง (ซึ่งคุณทำน้อยหรือไม่มีเลย) คุณทำมาก โดยค่าเริ่มต้น Bash จะไม่รวมประวัติและ Bash-exit อันที่สองจะเขียนทับข้อมูล.bash_historyที่ได้รับการอัปเดตอย่างดีจาก Bash-exit ครั้งแรก

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

หากมีการเปิดใช้งานตัวเลือกเชลล์ histappend (ดูคำอธิบายของ shopt ภายใต้คำสั่ง SHELL BUILTIN คำสั่งด้านล่าง) บรรทัดจะผนวกเข้ากับไฟล์ประวัติมิฉะนั้นไฟล์ประวัติจะถูกเขียนทับ

รายละเอียดเพิ่มเติมในคำตอบนี้รวมถึงวิธีการใช้งานHISTSIZE, HISTFILESIZEและHISTCONTROLการควบคุมขนาดซ้ำ ฯลฯ


3

แก้ไขประวัติใช้ขนาดสองตัวแปรทุบตีHISTSIZE, HISTFILESIZE(มักจะตั้งอยู่ใน.bashrc)

คำอธิบายจาก BASH man page:

HISTSIZE จำนวนคำสั่งที่ต้องจดจำในประวัติคำสั่ง (ดูประวัติด้านล่าง) หากค่าเป็น 0 คำสั่งจะไม่ถูกบันทึกในรายการประวัติ ค่าตัวเลขน้อยกว่าศูนย์ส่งผลให้ทุกคำสั่งถูกบันทึกไว้ในรายการประวัติ (ไม่ จำกัด ) เชลล์ตั้งค่าเริ่มต้นเป็น 500 หลังจากอ่านไฟล์เริ่มต้นใด ๆ

HISTFILESIZE จำนวนบรรทัดสูงสุดที่มีอยู่ในไฟล์ประวัติ เมื่อตัวแปรนี้ถูกกำหนดค่าไฟล์ประวัติจะถูกตัดออกหากจำเป็นเพื่อให้มีจำนวนบรรทัดไม่เกินจำนวนนั้นโดยการลบรายการที่เก่าที่สุด ไฟล์ประวัติจะถูกปัดเศษเป็นขนาดนี้หลังจากเขียนเมื่อเชลล์ออก หากค่าเป็น 0 ไฟล์ประวัติจะถูกปัดเศษเป็นขนาดศูนย์ ค่าที่ไม่ใช่ตัวเลขและค่าตัวเลขน้อยกว่าศูนย์ยับยั้งการตัด เชลล์ตั้งค่าเริ่มต้นเป็นค่า HISTSIZE หลังจากอ่านไฟล์เริ่มต้นใด ๆ

ตัวอย่างเช่นฉันมีการตั้งค่าต่อไปนี้ใน.bashrcไฟล์ของฉัน:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

1

ฉันเคยมีสิ่งนี้เกิดขึ้น แต่วิธีแก้ปัญหาไม่ได้อยู่ในรายการนี้ สาเหตุเป็นเพียงปัญหาการคัดลอก + วางอย่างง่าย ฉันกำลังคัดลอกคำสั่งจากเอกสารอื่นและฉันมีพื้นที่สีขาวเป็นพิเศษบนคลิปบอร์ด ด้วยเหตุผลบางอย่างนี้ทำให้ Ubuntu ไม่บันทึกคำสั่งลงในไฟล์ประวัติ

ป้อนคำอธิบายรูปภาพที่นี่

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


5
หนึ่งในตัวเลือกประวัติคือการละเว้นบรรทัด (ไม่บันทึก) ที่ขึ้นต้นด้วยช่องว่าง โดยปกติจะเป็นค่าเริ่มต้นเป็นเปิด สิ่งนี้สามารถเปลี่ยนแปลงได้ใน. bashrc ของคุณ
studog

1

ยืนยันได้ว่าคุณHISTCONTROLตัวแปรสภาพแวดล้อมไม่ได้ตั้งค่าหรือignorespaceignoreboth

$ echo $HISTCONTROL
ignoredups  #this is ok

คุณสามารถแก้ไขได้โดยการตั้งค่าใน~/.bash_profileหรือ~/.profileไฟล์ของคุณ:

HISTCONTROL=ignoredups

จากbashหน้าคน:

HISTCONTROL

รายการค่าที่คั่นด้วยโคลอนควบคุมวิธีบันทึกคำสั่งในรายการประวัติ

หากรายการของค่ามีรวมอยู่ignorespaceบรรทัดที่ขึ้นต้นด้วยอักขระเว้นวรรคจะไม่ถูกบันทึกในรายการประวัติ

ค่าของignoredupsสาเหตุทำให้บรรทัดที่ตรงกับรายการประวัติก่อนหน้านี้ไม่ถูกบันทึก

ค่าignorebothคือชวเลขและignorespaceignoredups

ค่าerasedupsทำให้สาเหตุบรรทัดก่อนหน้าทั้งหมดที่ตรงกับบรรทัดปัจจุบันถูกลบออกจากรายการประวัติก่อนที่จะบันทึกบรรทัดนั้น

ค่าใด ๆ ที่ไม่อยู่ในรายการด้านบนจะถูกละเว้น

หากHISTCONTROL ไม่มีการตั้งค่าหรือไม่รวมถึงค่าที่ถูกต้องทุกสายอ่านโดย parser HISTIGNOREเปลือกจะถูกบันทึกไว้ในรายการประวัติภายใต้ค่าของ HISTCONTROLสายที่สองและที่ตามมาของคำสั่งผสมหลายสายยังไม่ได้ผ่านการทดสอบและจะมีการเพิ่มประวัติโดยไม่คำนึงถึงความคุ้มค่าของ

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