ประวัติของ bash ถูกเก็บไว้ที่ไหน?


95

ถ้าฉันเรียกใช้historyฉันสามารถดูคำสั่งที่เรียกใช้ล่าสุดของฉันได้

แต่ถ้าฉันทำtail -f $HISTFILEหรือtail -f ~/.bash_historyพวกเขาไม่ได้อยู่ในรายการ

ไฟล์ถูกล็อคหรือไม่มีตำแหน่งชั่วคราวหรือคล้ายกัน

คำตอบ:


117

Bash เก็บรักษารายการคำสั่งภายในหน่วยความจำขณะที่ทำงานอยู่ พวกเขาเขียนไว้.bash_historyในทางออก :

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

หากคุณต้องการบังคับให้เขียนประวัติคำสั่งคุณสามารถใช้history -aคำสั่งซึ่งจะ:

ผนวกบรรทัดประวัติใหม่ (บรรทัดประวัติที่ป้อนตั้งแต่เริ่มต้นเซสชัน Bash ปัจจุบัน) ไปยังไฟล์ประวัติ

นอกจากนี้ยังมี-wตัวเลือก:

เขียนประวัติปัจจุบันไปยังไฟล์ประวัติ

ซึ่งอาจเหมาะกับคุณมากขึ้นขึ้นอยู่กับว่าคุณใช้ประวัติของคุณอย่างไร

หากคุณต้องการให้แน่ใจว่าพวกเขาจะถูกเขียนทันทีคุณสามารถใส่คำสั่งนั้นลงในPROMPT_COMMANDตัวแปรของคุณ:

export PROMPT_COMMAND='history -a'

หมายเหตุด้านข้าง: หาก.bash_historyไฟล์ของคุณเป็นเจ้าของโดยรูทโดยไม่ตั้งใจสิ่งต่าง ๆ หยุดทำงาน ในกรณีดังกล่าวให้ตรวจสอบความเป็นเจ้าของและใช้sudoเพื่อแก้ไขความเป็นเจ้าของหากจำเป็น
torek

13

(ไม่ใช่คำตอบ แต่ฉันไม่สามารถเพิ่มความคิดเห็นได้)

หากคุณกำลังตรวจสอบ.bash_historyเพราะคุณเพียงแค่ต้องการลบคำสั่งที่ระบุ (เช่นที่มีรหัสผ่านในการที่ชัดเจน), history -d <entry_id>คุณโดยตรงสามารถลบรายการในหน่วยความจำโดย

ตัวอย่างเช่นสมมติว่าเอาต์พุตเช่น:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

และคุณต้องการกำจัดexportเส้นคุณสามารถทำได้โดย:

history -d 928

11

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

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


2
คำตอบเริ่มต้นของคุณทำให้เสียงราวกับว่าประวัติถูกเก็บไว้ในไฟล์ที่เรียกว่า bash หรือแม้กระทั่งในbashexetable ฉันจะเขียน "มันถูกเก็บไว้bashในความทรงจำ, ... "
Anthon

ดีกว่าแน่นอน
Anthon

5

คำสั่งถูกบันทึกไว้ในหน่วยความจำ (RAM) ในขณะที่เซสชันของคุณทำงาน ทันทีที่คุณปิดเชลล์รายการคำสั่งจะถูกเขียนไป.bash_historyก่อนปิดเครื่อง

.bash_historyดังนั้นคุณจะไม่เห็นประวัติศาสตร์ของเซสชั่นในปัจจุบัน


4
ไฟล์ประวัติถูกอัพเดตเมื่อมีการbashยกเลิกซึ่งไม่ได้บอกเป็นนัยถึงการรีบูตเครื่อง (โดยเฉพาะในสภาพแวดล้อมแบบกราฟิกที่คุณสามารถเปิดและปิดเทอร์มินัลได้ตามที่คุณต้องการ)
John WH Smith

4

ในขณะที่ทำงานประวัติจะถูกเก็บไว้ในหน่วยความจำเท่านั้น (โดยค่าเริ่มต้น) หาก:

  • ตั้งค่าประวัติ -o (เป็นHในecho "$-") มีการตั้งค่า
  • HISTSIZE ไม่ใช่0 และ
  • HISTIGNORE ไม่ใช่*(หรือรูปแบบที่เข้มงวดอื่น ๆ )

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

ประวัติในหน่วยความจำถูกเขียนลงดิสก์ถ้า:

  • HISTFILESIZE ไม่ใช่ 0 และ
  • HISTFILE ไม่ได้ถูกตั้งค่า

แต่เมื่อเชลล์ออกหรือใช้คำสั่งhistory -a(ผนวก) หรือhistory -w(เขียน) เท่านั้น

หากต้องการทริกเกอร์การเขียนลงดิสก์ทันทีคุณสามารถใช้ตัวแปร:

 PROMPT_COMMAND='history -a'

ซึ่งจะสายประวัติศาสตร์ที่แฟ้มประวัติ เหล่านี้คือบรรทัดประวัติที่ป้อนตั้งแต่เริ่มต้นเซสชันเซสชันปัจจุบัน แต่ยังไม่ได้ผนวกเข้ากับไฟล์ประวัติappendnew

หรือ:

 PROMPT_COMMAND='history -w'

เพื่อเขียนทับประวัติใน HISTFILE ด้วยรายการจากหน่วยความจำ

ดังนั้นคุณสามารถลบคำสั่งออกจากประวัติในหน่วยความจำ:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

และเขียนลงดิสก์ด้วยคำสั่งสุดท้าย:

 history -w    # with `shopt -u histappend` unset

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