ถ้าฉันเรียกใช้history
ฉันสามารถดูคำสั่งที่เรียกใช้ล่าสุดของฉันได้
แต่ถ้าฉันทำtail -f $HISTFILE
หรือtail -f ~/.bash_history
พวกเขาไม่ได้อยู่ในรายการ
ไฟล์ถูกล็อคหรือไม่มีตำแหน่งชั่วคราวหรือคล้ายกัน
ถ้าฉันเรียกใช้history
ฉันสามารถดูคำสั่งที่เรียกใช้ล่าสุดของฉันได้
แต่ถ้าฉันทำtail -f $HISTFILE
หรือtail -f ~/.bash_history
พวกเขาไม่ได้อยู่ในรายการ
ไฟล์ถูกล็อคหรือไม่มีตำแหน่งชั่วคราวหรือคล้ายกัน
คำตอบ:
Bash เก็บรักษารายการคำสั่งภายในหน่วยความจำขณะที่ทำงานอยู่ พวกเขาเขียนไว้.bash_history
ในทางออก :
เมื่อเชลล์เชิงโต้ตอบออกจากบรรทัด $ HISTSIZE สุดท้ายจะถูกคัดลอกจากรายการประวัติไปยังไฟล์ที่มีชื่อโดย $ HISTFILE
หากคุณต้องการบังคับให้เขียนประวัติคำสั่งคุณสามารถใช้history -a
คำสั่งซึ่งจะ:
ผนวกบรรทัดประวัติใหม่ (บรรทัดประวัติที่ป้อนตั้งแต่เริ่มต้นเซสชัน Bash ปัจจุบัน) ไปยังไฟล์ประวัติ
นอกจากนี้ยังมี-w
ตัวเลือก:
เขียนประวัติปัจจุบันไปยังไฟล์ประวัติ
ซึ่งอาจเหมาะกับคุณมากขึ้นขึ้นอยู่กับว่าคุณใช้ประวัติของคุณอย่างไร
หากคุณต้องการให้แน่ใจว่าพวกเขาจะถูกเขียนทันทีคุณสามารถใส่คำสั่งนั้นลงในPROMPT_COMMAND
ตัวแปรของคุณ:
export PROMPT_COMMAND='history -a'
(ไม่ใช่คำตอบ แต่ฉันไม่สามารถเพิ่มความคิดเห็นได้)
หากคุณกำลังตรวจสอบ.bash_history
เพราะคุณเพียงแค่ต้องการลบคำสั่งที่ระบุ (เช่นที่มีรหัสผ่านในการที่ชัดเจน), history -d <entry_id>
คุณโดยตรงสามารถลบรายการในหน่วยความจำโดย
ตัวอย่างเช่นสมมติว่าเอาต์พุตเช่น:
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
และคุณต้องการกำจัดexport
เส้นคุณสามารถทำได้โดย:
history -d 928
bash เก็บไว้ในหน่วยความจำใช้งานได้ bash สามารถกำหนดค่าให้บันทึกเมื่อ bash ปิดหรือหลังจากแต่ละคำสั่งและจะโหลดเมื่อ bash เริ่มทำงานหรือตามคำขอ
หากคุณกำหนดค่าให้บันทึกหลังจากแต่ละคำสั่งให้พิจารณาถึงความหมายของการมีการทุบตีหลายครั้งในเวลาเดียวกัน (บรรทัดคำสั่งจะถูกแทรก)
bash
exetable ฉันจะเขียน "มันถูกเก็บไว้bash
ในความทรงจำ, ... "
คำสั่งถูกบันทึกไว้ในหน่วยความจำ (RAM) ในขณะที่เซสชันของคุณทำงาน ทันทีที่คุณปิดเชลล์รายการคำสั่งจะถูกเขียนไป.bash_history
ก่อนปิดเครื่อง
.bash_history
ดังนั้นคุณจะไม่เห็นประวัติศาสตร์ของเซสชั่นในปัจจุบัน
bash
ยกเลิกซึ่งไม่ได้บอกเป็นนัยถึงการรีบูตเครื่อง (โดยเฉพาะในสภาพแวดล้อมแบบกราฟิกที่คุณสามารถเปิดและปิดเทอร์มินัลได้ตามที่คุณต้องการ)
ในขณะที่ทำงานประวัติจะถูกเก็บไว้ในหน่วยความจำเท่านั้น (โดยค่าเริ่มต้น) หาก:
H
ในecho "$-"
) มีการตั้งค่า0
และ*
(หรือรูปแบบที่เข้มงวดอื่น ๆ )หากข้อใดข้อหนึ่งข้างต้นล้มเหลวจะไม่มีการบันทึกประวัติในหน่วยความจำดังนั้นจึงไม่มีประวัติที่สามารถบันทึกลงดิสก์ได้
ประวัติในหน่วยความจำถูกเขียนลงดิสก์ถ้า:
แต่เมื่อเชลล์ออกหรือใช้คำสั่งhistory -a
(ผนวก) หรือhistory -w
(เขียน) เท่านั้น
หากต้องการทริกเกอร์การเขียนลงดิสก์ทันทีคุณสามารถใช้ตัวแปร:
PROMPT_COMMAND='history -a'
ซึ่งจะสายประวัติศาสตร์ที่แฟ้มประวัติ เหล่านี้คือบรรทัดประวัติที่ป้อนตั้งแต่เริ่มต้นเซสชันเซสชันปัจจุบัน แต่ยังไม่ได้ผนวกเข้ากับไฟล์ประวัติappend
new
หรือ:
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
.bash_history
ไฟล์ของคุณเป็นเจ้าของโดยรูทโดยไม่ตั้งใจสิ่งต่าง ๆ หยุดทำงาน ในกรณีดังกล่าวให้ตรวจสอบความเป็นเจ้าของและใช้sudo
เพื่อแก้ไขความเป็นเจ้าของหากจำเป็น