ฉันจะป้องกันไม่ให้คำสั่งปรากฏในประวัติ Bash ได้อย่างไร


96

บางครั้งเมื่อผมใช้คำสั่งเช่นผมไม่อยากให้เรื่องนี้ได้รับการบันทึกไว้ในประวัติศาสตร์ทุบตีเพราะผมตั้งใจจะเรียกใช้คำสั่งเดียวกันอีกครั้งโดยrm -rf XYZ reverse-i-searchมีวิธีที่ดีในการป้องกันไม่ให้เกิดเหตุการณ์นี้หรือไม่?



ในขณะที่bash อาจใช้สำหรับการเขียนเชลล์สคริปต์ (ดังนั้นการเขียนโปรแกรม) ลักษณะเฉพาะนี้ไม่เกี่ยวข้องกับการเขียนโปรแกรมอย่างแน่นอน (ประวัติศาสตร์เป็นสิ่งที่โต้ตอบได้เท่านั้น) ปิดการลงคะแนน
paxdiablo

คำตอบ:


114

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

ตัวอย่างเช่น:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

นี่คือสิ่งที่man bashกล่าวว่า:

HISTCONTROL

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

ดูสิ่งนี้ด้วย:


53

ใน. bashrc / .bash_profile / ทุกที่ที่คุณต้องการให้ใส่export HISTIGNORE=' *'. จากนั้นเริ่มคำสั่งที่คุณต้องการละเว้นด้วยช่องว่างเดียว

$ ls  # goes in history
$  ls # does not

4
ขึ้นอยู่กับค่าของHISTCONTROLตัวแปรสภาพแวดล้อมซึ่งไม่จำเป็นต้องignorespaceตั้งค่าไว้
sorpigal

3
หากHISTCONTROLมีignorespaceการรวม "*" ในHISTIGNOREนั้นซ้ำซ้อนเท่านั้น ทั้งสองทำงานอย่างอิสระ
chepner

22

HISTIGNOREการใช้งานที่ดียิ่งขึ้น สิ่งนี้ช่วยให้คุณสามารถระบุชุดของรูปแบบที่จะละเว้น (เช่นrm) มันจะดีกว่า (ฉันคิด) /dev/nullมากกว่าเพียงแค่ท่อประวัติทั้งหมดเพื่อ


อ่าใช่ลืมไปแล้ว :)
Corey Henderson

13
kill -9 $$

ฉันรู้ว่านั่นไม่ดีที่สุดเท่าคำตอบก่อนหน้านี้ แต่จะฆ่า Bash เชลล์ปัจจุบันโดยไม่บันทึกอะไรเลยมีประโยชน์เมื่อไม่ได้ตั้งค่า HISTCONTROL ตามค่าเริ่มต้นคุณลืมตั้งค่าหรือบริสุทธิ์และเรียบง่ายที่คุณลืมใส่ช่องว่าง และคุณเพิ่งพิมพ์รหัสผ่านบางรหัสและไม่ต้องการให้รหัสผ่านนั้นคงอยู่อย่างถาวรในประวัติศาสตร์

นี่เป็นวิธีที่รวดเร็วและบางอย่างเช่นการลบไฟล์ประวัติก็ทำได้ไม่ดีนักเพราะคุณต้องทำนอกเชลล์บันทึกประวัติ (เข้าสู่ระบบในฐานะผู้ใช้อื่นและใช้ su / sudo สร้างงานพื้นหลัง ฯลฯ )


8

คุณสามารถทำอย่างใดอย่างหนึ่งจากสองสิ่ง:

export HISTFILE=/dev/null

หรือเริ่มต้นคำสั่งด้วยช่องว่าง


5
พื้นที่ก่อนที่จะยอดเยี่ยม
Eric Fortis

8
พวกเราบางคนคิดว่าคำสั่งเพิกเฉยโดยอัตโนมัติที่นำหน้าด้วยช่องว่างเป็นความคิดที่แย่มากดังนั้นจึงไม่ได้ignorespaceตั้งค่าไว้เป็นค่าเริ่มต้น
sorpigal

3
การตั้งค่าHISTFILEด้วยวิธีนี้จะป้องกันการจัดเก็บประวัติใด ๆและไม่ป้องกันไม่ให้เพิ่มคำสั่งลงในประวัติในหน่วยความจำ
chepner

3

หรือ

unset HISTFILE

(คล้ายกับคำตอบก่อนหน้าสั้นกว่าเท่านั้น: ส่งออก HISTFILE = / dev / null)


1
สิ่งนี้มีผลกับประวัติบนดิสก์เท่านั้นไม่ใช่ประวัติในหน่วยความจำ
chepner

2

เมื่อเริ่มต้นเชลล์ฉันล้างประวัติอย่างชัดเจนจากรายการที่ฉันไม่ต้องการอยู่ที่นั่น ตัวอย่างเช่นฉันไม่ต้องการสิ่งใด ๆrm -rfในประวัติ (มันเป็นบาดแผลหลังจากลบไดเร็กทอรีที่เต็มไปด้วยผลลัพธ์ที่ประมวลผลในชั่วข้ามคืนเพียงแค่Arrow-Up+ เดียวEnter:)

ฉันใส่ข้อมูลโค้ดต่อไปนี้ในไฟล์ init ของฉัน (ใช้ได้กับ.zshrcควรใช้ด้วย.bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.