ทุบตี HISTSIZE กับ HISTFILESIZE?


174

ข้อแตกต่างในการHISTSIZEเปรียบเทียบHISTFILESIZEคืออะไร?

พวกเขาจะใช้ในการขยายประวัติทุบตีเกินกว่า 500 บรรทัดเริ่มต้น

ดูเหมือนว่าจะไม่มีความชัดเจนที่นี่และในฟอรัมอื่น ๆ เกี่ยวกับสาเหตุที่ทั้งคู่ต้องการ ( ตัวอย่างที่ 1 , 2 ตัวอย่าง , ตัวอย่างที่ 3 )

คำตอบ:


289

คำตอบสั้น ๆ :

HISTSIZE คือจำนวนบรรทัดหรือคำสั่งที่เก็บไว้ในหน่วยความจำในรายการประวัติขณะที่เซสชัน bash ของคุณดำเนินการอยู่

HISTFILESIZE คือจำนวนบรรทัดหรือคำสั่งที่ (a) ได้รับอนุญาตในไฟล์ประวัติเมื่อเวลาเริ่มต้นของเซสชันและ (b) ถูกเก็บไว้ในไฟล์ประวัติเมื่อสิ้นสุดเซสชัน bash ของคุณเพื่อใช้ในเซสชันในอนาคต

สังเกตเห็นความแตกต่างระหว่างfile: บนดิสก์ - และlist: ในหน่วยความจำ

คำตอบยาว:

ข้อมูลทั้งหมดข้างต้น + ตัวอย่างบางส่วน:

ตัวอย่างที่ 1 : HISTFILESIZE=10และHISTSIZE=10

  1. คุณเริ่มเซสชันของคุณ
  2. HISTFILE ของคุณ (ไฟล์ที่เก็บประวัติคำสั่ง bash ของคุณ) ถูกตัดทอนเพื่อให้มี HISTFILESIZE = 10 บรรทัด
  3. คุณเขียน 50 บรรทัด
  4. ในตอนท้ายของ 50 คำสั่งของคุณเท่านั้นคำสั่ง 41 ถึง 50 อยู่ในรายการประวัติของคุณซึ่งขนาดจะถูกกำหนดโดย HISTSIZE = 10
  5. คุณสิ้นสุดเซสชันของคุณ
  6. สมมติhistappendว่าไม่ได้เปิดใช้งานคำสั่ง 41 ถึง 50 จะถูกบันทึกลงใน HISTFILE ของคุณซึ่งตอนนี้มี 10 คำสั่งที่จัดขึ้นที่จุดเริ่มต้นรวมทั้ง 10 คำสั่งที่เขียนใหม่
  7. HISTFILE ของคุณถูกตัดทอนเพื่อให้มี HISTFILESIZE = 10 บรรทัด
  8. ตอนนี้คุณมี 10 คำสั่งในประวัติของคุณ - 10 คำสั่งสุดท้ายที่คุณเพิ่งพิมพ์ในเซสชันที่คุณเพิ่งทำเสร็จ
  9. เมื่อคุณเริ่มเซสชันใหม่คุณจะเริ่มต้นที่ 1 ด้วย HISTFILE of HISTFILESIZE = 10

ตัวอย่างที่ 2 : HISTFILESIZE=10และHISTSIZE=5

  1. คุณเริ่มเซสชันของคุณ
  2. HISTFILE ของคุณ (ไฟล์ที่เก็บประวัติคำสั่ง bash ของคุณ) ถูกตัดทอนเพื่อให้มี HISTFILESIZE มากที่สุด = 10 บรรทัด
  3. คุณเขียน 50 บรรทัด
  4. ในตอนท้ายของ 50 คำสั่งของคุณเท่านั้นคำสั่ง 46 ถึง 50 อยู่ในรายการประวัติของคุณซึ่งขนาดจะถูกกำหนดโดย HISTSIZE = 5
  5. คุณสิ้นสุดเซสชันของคุณ
  6. สมมติhistappendว่าไม่ได้เปิดใช้งานคำสั่ง 46 ถึง 50 จะถูกบันทึกลงใน HISTFILE ของคุณซึ่งตอนนี้มี 10 คำสั่งที่จัดขึ้นที่จุดเริ่มต้นรวมทั้ง 5 คำสั่งที่เขียนใหม่
  7. HISTFILE ของคุณถูกตัดทอนเพื่อให้มี HISTFILESIZE = 10 บรรทัด
  8. ตอนนี้คุณมี 10 คำสั่งในประวัติของคุณ - 5 จากเซสชั่นก่อนหน้าและ 5 ครั้งล่าสุดที่คุณเพิ่งพิมพ์ในเซสชั่นที่คุณเพิ่งจะเสร็จสิ้น
  9. เมื่อคุณเริ่มเซสชันใหม่คุณจะเริ่มต้นที่ 1 ด้วย HISTFILE of HISTFILESIZE = 10

ตัวอย่างที่ 3 : HISTFILESIZE=5และHISTSIZE=10

  1. คุณเริ่มเซสชันของคุณ
  2. HISTFILE ของคุณ (ไฟล์ที่เก็บประวัติคำสั่ง bash ของคุณ) ถูกตัดทอนเพื่อให้มี HISTFILESIZE มากที่สุด = 5 บรรทัด
  3. คุณเขียน 50 บรรทัด
  4. ในตอนท้ายของ 50 คำสั่งของคุณเท่านั้นคำสั่ง 41 ถึง 50 อยู่ในรายการประวัติของคุณซึ่งขนาดจะถูกกำหนดโดย HISTSIZE = 10
  5. คุณสิ้นสุดเซสชันของคุณ
  6. สมมติhistappendว่าไม่ได้เปิดใช้งานคำสั่ง 41 ถึง 50 จะถูกบันทึกลงใน HISTFILE ของคุณซึ่งตอนนี้มีคำสั่ง 5 คำสั่งที่เริ่มต้นรวมกับคำสั่งที่เขียนใหม่ 10 คำสั่ง
  7. HISTFILE ของคุณถูกตัดให้มี HISTFILESIZE = 5 บรรทัด
  8. ตอนนี้คุณมี 5 คำสั่งในประวัติของคุณ - 5 คำสั่งสุดท้ายที่คุณเพิ่งพิมพ์ในเซสชันที่คุณเพิ่งทำเสร็จ
  9. เมื่อคุณเริ่มเซสชันใหม่คุณจะเริ่มต้นใหม่ในขั้นตอนที่ 1 ด้วย HISTFILE of HISTFILESIZE = 5

ข้อมูลจากelixir_sinari :

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

และจากman bashหน้า:

ค่าของตัวแปร HISTSIZE ถูกใช้เป็นจำนวนคำสั่งเพื่อบันทึกในรายการประวัติ ข้อความของคำสั่ง HISTSIZE ล่าสุด (ค่าเริ่มต้น 500) ถูกบันทึกไว้ ( ... )

เมื่อเริ่มต้นประวัติจะเริ่มต้นจากไฟล์ที่มีชื่อโดยตัวแปร HISTFILE (ค่าเริ่มต้น ~ / .bash_history) ไฟล์ที่ตั้งชื่อโดยค่าของ HISTFILE จะถูกปัดเศษหากจำเป็นเพื่อให้มีจำนวนบรรทัดไม่เกินจำนวนที่ระบุโดยค่าของ HISTFILESIZE (... ) เมื่อเชลล์การโต้ตอบออกจากบรรทัด $ HISTSIZE สุดท้ายจะถูกคัดลอกจากรายการประวัติไปยัง $ HISTFILE หากมีการเปิดใช้งานตัวเลือกเชลล์ histappend (ดูคำอธิบายของ shopt ภายใต้คำสั่ง SHELL BUILTIN คำสั่งด้านล่าง) บรรทัดจะผนวกเข้ากับไฟล์ประวัติมิฉะนั้นไฟล์ประวัติจะถูกเขียนทับ หาก HISTFILE ไม่ได้ถูกตั้งค่าไว้หรือหากไฟล์ประวัตินั้นไม่สามารถเขียนได้ประวัติจะไม่ถูกบันทึก (... ) หลังจากบันทึกประวัติไฟล์ประวัติจะถูกตัดให้มีบรรทัด HISTFILESIZE ไม่เกินบรรทัด หาก HISTFILESIZE ไม่ได้ถูกตั้งค่าไว้


27
+1 คำตอบนี้ละเอียดอย่างน่าประทับใจ! ฉันคิดว่าค่อนข้างมากไปหน่อย คนส่วนใหญ่จะไม่ถึงจุดสิ้นสุด ฉันคิดว่าคุณควรพิจารณาสรุป
slezica

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

1
@Bastien สมมติว่าคุณเป็นผู้แยกวิเคราะห์สัญลักษณ์คุณจะไม่มีปัญหาในการอ่านข้อความนี้
Pithikos

6
ดูสิฮาร์ดไดรฟ์ของฉันคือ 1 TB และส่วนใหญ่ว่างเปล่าและฉันมีจำนวนรอบของ CPU ที่ไม่ได้ใช้งานและ RAM และฉันต้องการบันทึกประวัติทุบตีมากที่สุดเท่าที่จะเป็นไปได้อย่างสมเหตุสมผล - ดังนั้นเมื่อฉันต้องการค้นหาคำสั่งโง่ ๆ นั้น ไม่ทำงานในสองปีฉันรู้ว่ามันอยู่ในประวัติทุบตี เพื่อทำให้เป็นรูปธรรมมากขึ้นสมมติว่ามีประวัติทุบตีมากถึง 50 MB คุณแนะนำค่าอะไร
CivFan

2
@ Matewew ขอโทษไม่รู้!
arturomp

6

การสร้างสิ่งที่ arturomp ได้พูดไว้และพยายามทำให้ชัดเจนขึ้น

สมมติว่าคุณมีประวัติศาสตร์อันยาวนานถึง 2000 เรื่อง ..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

คุณสามารถลดสิ่งที่คุณแสดงด้วย HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

ทีนี้ไม่ว่าคุณจะพิมพ์คำสั่งกี่คำ แต่จะบันทึกได้เพียง 5 ครั้งล่าสุดเท่านั้น

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

เราสามารถเห็นได้อย่างชัดเจนว่าคำสั่งแรกของเรา ("ABC") ไม่ได้อยู่ในประวัติตั้งแต่บันทึกคำสั่งเพียง 5 ครั้งล่าสุด

ตอนนี้ประวัติศาสตร์ทั้งหมดจะถูกเก็บไว้ในไฟล์ ( .bash_history) HISTFILESIZEและคุณสามารถปรับเปลี่ยนวิธียาวไฟล์นี้ได้รับด้วย เช่น2033 HISTFILESIZEในกรณีของฉันฉันจะได้สิ่งนี้:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

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

10
@CivFan: ชุดและHISTSIZE=-1 HISTFILESIZE=-1
M. Dudley

2
นี่เป็นความผิดที่ผิด การตั้งค่าเป็น -1 จะล้างทุกอย่าง
Brendan Byrd

3
@BrendanByrd bashหน้าคนพูดว่า: Non-numeric values and numeric values less than zero inhibit truncationแต่แล้วฉันไม่ได้มีความกล้าที่จะตรวจสอบว่านี้เป็นความจริงเพราะฉันไม่ต้องการที่จะสูญเสียประวัติของฉัน :-)
SebMa

3
@SebMa ผมเปลี่ยนการตั้งค่าของฉันไปและHISTSIZE='INFINITY' HISTFILESIZE='ANDBEYOND'เนื่องจากไม่ใช่ตัวเลขจึงบันทึกทุกอย่าง ขอบคุณสำหรับทิป!
คอนเนอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.