เนื้อหาของไฟล์. bash_history ใช้เวลานานเท่าใด


11

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



2
ฉันไม่เชื่อว่าไฟล์นี้จะถูกควบคุมตามระยะเวลา แต่เป็นขนาดที่เหมาะสมที่สุดของไฟล์ ดูที่นี่: มีวิธีกำหนดขนาดของรายการประวัติเป็น bash มากกว่า 5,000 บรรทัดหรือไม่ . ดังนั้น env ตัวแปรHISTSIZEและHISTFILESIZEเป็นพื้นผิวการควบคุมเพียงอย่างเดียวที่คุณต้องควบคุมว่าจะรักษาประวัติไว้มากแค่ไหน
slm

คำตอบ:


12

มีตัวแปรสองตัวที่ควบคุมขนาดประวัติ:

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

และ

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

ตัวแปรทั้งสองนี้ช่วยให้คุณสามารถควบคุมพฤติกรรมของประวัติของคุณได้ โดยทั่วไปHISTSIZEคือจำนวนคำสั่งที่บันทึกระหว่างเซสชันปัจจุบันของคุณและHISTFILESIZEเป็นจำนวนคำสั่งที่จะถูกจดจำข้ามเซสชัน ตัวอย่างเช่น:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

ในตัวอย่างข้างต้นเนื่องจากHISTSIZEตั้งค่าเป็น 10 historyจะส่งคืนรายการคำสั่ง 10 รายการ อย่างไรก็ตามหากคุณออกจากระบบแล้วกลับเข้าสู่ระบบhistoryจะส่งกลับเพียง 5 คำสั่งเพราะHISTFILESIZEตั้งไว้ที่ 5 เนื่องจากเมื่อคุณออกจากเซสชันHISTFILESIZEของคุณประวัติของคุณจะถูกบันทึกลงในไฟล์ประวัติของคุณ ( ~/.bash_historyโดยค่าเริ่มต้น แต่ควบคุมโดยHISTFILE) กล่าวอีกนัยหนึ่งคำสั่งจะถูกเพิ่มเข้าไปHISTFILEจนกว่าจะถึง$HISTFILESIZEบรรทัดที่จุดแต่ละบรรทัดต่อมาเพิ่มหมายถึงคำสั่งแรกของไฟล์จะถูกลบออก

คุณสามารถกำหนดค่าของตัวแปรเหล่านี้ใน~/.profile(หรือ~/.bash_profileถ้าไฟล์นั้นมีอยู่) ไม่ได้ตั้งค่าไว้ในคุณ~/.bashrcครั้งแรกเพราะพวกเขามีธุรกิจไม่ถูกตั้งอยู่ที่นั่นและประการที่สองเพราะที่จะทำให้คุณมีพฤติกรรมที่แตกต่างกันในการเข้าสู่ระบบเทียบกับเปลือกหอยที่ไม่ได้เข้าสู่ระบบซึ่งสามารถนำไปสู่ปัญหาอื่น

ตัวแปรที่มีประโยชน์อื่น ๆ ที่ช่วยให้คุณปรับพฤติกรรมของประวัติของคุณได้ดีคือ:

  • HISTIGNORE: สิ่งนี้ช่วยให้คุณสามารถละเว้นคำสั่งทั่วไปบางอย่างที่ไม่ค่อยสนใจ ตัวอย่างเช่นคุณสามารถตั้งค่า:

    export HISTIGNORE="pwd:df:du"

    ที่จะทำให้เกิดคำสั่งใด ๆ ที่เริ่มต้นด้วยpwd, dfหรือduที่จะละเลยและไม่ได้บันทึกไว้ในประวัติของคุณ

  • HISTCONTROL: อันนี้ให้คุณเลือกวิธีการทำงานของประวัติ ส่วนตัวผมตั้งไว้HISTCONTROL=ignoredupsที่ทำให้บันทึกคำสั่งซ้ำเพียงครั้งเดียว ตัวเลือกอื่น ๆ คือignorespaceการละเว้นคำสั่งที่ขึ้นต้นด้วยช่องว่างและerasedupsทำให้บรรทัดก่อนหน้าทั้งหมดตรงกับบรรทัดปัจจุบันจะถูกลบออกจากรายการประวัติก่อนที่จะบันทึกบรรทัดนั้น ignorebothจดชวเลขสำหรับการเพิกเฉยและการเพิกเฉย

  • HISTTIMEFORMAT: ใช้สำหรับกำหนดรูปแบบเวลาของไฟล์ประวัติ ดูคำตอบของ Pandya หรืออ่านman bashรายละเอียด


สำหรับการปรับจูนเพิ่มเติมคุณมี:

  • histappendตัวเลือกทุบตี สิ่งนี้สามารถตั้งค่าได้โดยการเรียกใช้shopt -s histappendหรือเพิ่มคำสั่ง~/.bashrcนั้นใน หากตั้งค่าตัวเลือกนี้

    รายการประวัติจะถูกผนวกเข้ากับไฟล์ที่ตั้งชื่อโดยค่าของตัวแปร HISTFILE เมื่อเชลล์ออกจากแทนที่จะเขียนทับไฟล์

    สิ่งนี้มีประโยชน์มากเพราะช่วยให้คุณสามารถรวมประวัติของเซสชันต่างๆ (คิดว่าเทอร์มินัลต่างกันเป็นต้น)

  • historyคำสั่งมีสองตัวเลือกที่มีประโยชน์:

    • history -a : ทำให้คำสั่งสุดท้ายถูกเขียนลงในไฟล์ประวัติโดยอัตโนมัติ

    • history -r : นำเข้าไฟล์ประวัติลงในเซสชันปัจจุบัน

    ตัวอย่างเช่นคุณสามารถเพิ่มคำสั่งทั้งสองนี้ไปยังของคุณPROMPT_COMMAND(ซึ่งจะถูกดำเนินการในแต่ละครั้งที่เชลล์แสดงพรอมต์ดังนั้นเมื่อใดก็ตามที่คุณเริ่มเชลล์ใหม่และหลังจากแต่ละคำสั่งที่คุณรันอยู่):

    export PROMPT_COMMAND='history -a;history -r;'

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


2

ขนาดเริ่มต้นของไฟล์ประวัติคือ 500 บรรทัด เมื่อไฟล์. bash_history ถึง 500 บรรทัดรายการเริ่มต้นจะถูกตัดเพื่อให้มีที่ว่างสำหรับบรรทัดใหม่กว่าเช่นเดียวกับใน FIFO คุณสามารถเปลี่ยนแปลงสิ่งนี้ได้โดยการเปลี่ยนค่าของตัวแปรHISTFILESIZEซึ่งโดยปกติแล้วจะมีค่า 500

การใส่ a HISTFILESIZE=10000.bashrc ของคุณจะเพิ่มจำนวนบรรทัดที่ไฟล์ประวัติสามารถเก็บไว้ที่ 10,000 ซึ่งจะเป็นการเพิ่มอายุการใช้งานของเนื้อหา


2
หมายเหตุ: หากคุณเพิ่มHISTSIZEขีด จำกัด ให้พิจารณาการเปลี่ยนแปลงHISTFILEด้วย หากคุณเรียกใช้bash --norc HISTSIZEจะกลับไปเป็นค่าเริ่มต้นตัดทอนของคุณHISTFILEเมื่อออก
llua

ขอบคุณ @llua ในทำนองเดียวกันหากระบบของคุณ/etc/bash.bashrcตั้งค่าเป็นHISTFILESIZE(หรืออาจเป็นHISTSIZE; ฉันยังไม่ได้ตรวจสอบว่ามี) แล้ว Bash ดูเหมือนจะตัดทอน.bash_historyที่จุดที่อ่าน/etc/bash.bashrc(หรืออย่างน้อยในบางจุดก่อนที่ขีด จำกัด ใหม่ของคุณจะถูกกำหนดในไฟล์ Bash init ของคุณเอง) เพื่อหลีกเลี่ยงปัญหานี้ให้ตั้งค่าของคุณเองอีกครั้งHISTFILEเพื่อให้ประวัติจริงของคุณไปที่นั่นและไม่ได้อยู่ใน.bash_historyไฟล์ที่ Bash กำลังตัดทอน
Chris Povirk

(แต่ไม่exportทำอย่างนั้นจะทำให้มันปรากฏแก่เปลือกหอยลูกใด ๆ ซึ่งก็สามารถที่จะตัดทอนมันแทน.bash_history!)
Chris Povirk

0

อ่านman bashรายละเอียดเพิ่มเติมเกี่ยวกับประวัติทุบตีเช่น:

HISTCONTROL
       รายการค่าคั่นด้วยโคลอนควบคุมวิธีบันทึกคำสั่งในรายการประวัติ
       หากรายการค่ามีการไม่ตอบสนองบรรทัดที่ขึ้นต้นด้วยอักขระเว้นวรรคคือ
       ไม่ได้บันทึกในรายการประวัติ ค่าของการเพิกเฉยทำให้เกิดบรรทัดที่ตรงกับก่อนหน้านี้
       รายการประวัติที่ไม่ถูกบันทึก ค่าของการไม่ใช้ทั้งสองอย่างนั้นเป็นสิ่งที่จดย่อสำหรับการเพิกเฉยและ
       ignoredups ค่าของการลบทำให้เกิดบรรทัดก่อนหน้าทั้งหมดที่ตรงกับบรรทัดปัจจุบัน
       ถูกลบออกจากรายการประวัติก่อนที่จะบันทึกบรรทัดนั้น ค่าใด ๆ ที่ไม่ได้อยู่ในข้างต้น
       รายการจะถูกละเว้น หาก HISTCONTROL ไม่ได้ตั้งค่าไว้หรือไม่ได้รวมค่าที่ถูกต้องทุกบรรทัด
       อ่านโดยตัวแยกวิเคราะห์เชลล์จะถูกบันทึกในรายการประวัติภายใต้ค่าของ HISTIG‐
       NORE บรรทัดที่สองและต่อมาของคำสั่งผสมหลายบรรทัดจะไม่ถูกทดสอบ
       และถูกเพิ่มเข้าไปในประวัติโดยไม่คำนึงถึงมูลค่าของ HISTCONTROL
HISTFILE
       ชื่อของไฟล์ที่บันทึกคำสั่งประวัติ (ดูประวัติด้านล่าง) ค่าเริ่มต้น
       ค่าคือ ~ / .bash_history หากไม่ได้ตั้งค่าประวัติคำสั่งจะไม่ถูกบันทึกเมื่อเชลล์ออก
HISTFILESIZE
       จำนวนบรรทัดสูงสุดที่มีอยู่ในไฟล์ประวัติ เมื่อตัวแปรนี้ถูกกำหนด
       ค่าไฟล์ประวัติจะถูกปัดเศษหากจำเป็นเพื่อให้มีไม่เกินจำนวนนั้น
       ของบรรทัดโดยลบรายการที่เก่าที่สุด ไฟล์ประวัติจะถูกปัดเศษเป็นขนาดนี้เช่นกัน
       หลังจากเขียนมันเมื่อเชลล์ออก หากค่าเป็น 0 ไฟล์ประวัติจะถูกปัดเศษเป็น
       ขนาดศูนย์ ค่าที่ไม่ใช่ตัวเลขและค่าตัวเลขน้อยกว่าศูนย์ยับยั้งการตัด 
       เชลล์ตั้งค่าเริ่มต้นเป็นค่า HISTSIZE หลังจากอ่านไฟล์เริ่มต้นใด ๆ
HISTIGNORE
       รายการรูปแบบที่คั่นด้วยโคลอนใช้เพื่อตัดสินใจว่าควรบันทึกบรรทัดคำสั่งใด
       รายการประวัติ แต่ละรูปแบบจะถูกยึดที่จุดเริ่มต้นของบรรทัดและจะต้องตรงกับ
       บรรทัดที่สมบูรณ์ (ไม่มีการต่อท้าย `* 'ต่อท้าย) แต่ละรูปแบบจะทดสอบกับบรรทัด
       หลังจากการตรวจสอบที่ระบุโดย HISTCONTROL ถูกนำไปใช้ นอกจากเปลือกปกติแล้ว
       อักขระการจับคู่รูปแบบ `& 'จับคู่บรรทัดประวัติก่อนหน้า `& 'อาจถูกหลบหนี
       ใช้แบ็กสแลช แบ็กสแลชจะถูกลบออกก่อนที่จะพยายามจับคู่ ครั้งที่สองและ
       บรรทัดที่ตามมาของคำสั่งผสมหลายบรรทัดจะไม่ถูกทดสอบและถูกเพิ่มเข้ากับ
       ประวัติโดยไม่คำนึงถึงมูลค่าของ HISTIGNORE
HISTSIZE
       จำนวนคำสั่งที่ต้องจดจำในประวัติคำสั่ง (ดูประวัติด้านล่าง) หากว่า
       ค่าเป็น 0 คำสั่งจะไม่ถูกบันทึกในรายการประวัติ ค่าตัวเลขน้อยกว่าศูนย์
       ส่งผลให้ทุกคำสั่งถูกบันทึกไว้ในรายการประวัติ (ไม่ จำกัด ) เปลือกหอย
       ตั้งค่าเริ่มต้นเป็น 500 หลังจากอ่านไฟล์เริ่มต้นใด ๆ
HISTTIMEFORMAT
       หากตัวแปรนี้ถูกตั้งค่าและไม่เป็นโมฆะค่าจะถูกใช้เป็นสตริงรูปแบบสำหรับ strftime (3)
       เพื่อพิมพ์การประทับเวลาที่เกี่ยวข้องกับรายการประวัติแต่ละรายการที่แสดงโดยประวัติ
       builtin หากมีการตั้งค่าตัวแปรนี้การประทับเวลาจะถูกเขียนลงในไฟล์ประวัติเพื่อให้สามารถ
       ถูกเก็บรักษาไว้ในช่วงเชลล์ สิ่งนี้ใช้อักขระแสดงความคิดเห็นประวัติเพื่อแยกแยะ
       การประทับเวลา guish จากบรรทัดประวัติศาสตร์อื่น ๆ

โดยเฉพาะอย่างยิ่งHISTFILESIZEและHISTSIZEอาจคุณกำลังมองหาและช่วยให้คุณ

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