วิธีหลีกเลี่ยงรายการที่ซ้ำกันใน. bash_history


108

คำสั่งเดียวกันแสดงอยู่ในประวัติของฉันซ้ำแล้วซ้ำอีก ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร ฉันรู้ว่าเป็นไปได้ผ่านทางHISTCONTROLแต่ฉันไม่พบวิธีที่ถูกต้อง


ฉันสร้างคำถามที่เกี่ยวข้อง: askubuntu.com/questions/205520/… . Dups ในประวัติศาสตร์มีประโยชน์ในการดูบริบทของคำสั่ง สิ่งที่คุณต้องการละเว้น dups บางครั้งเมื่อคุณพิมพ์ประวัติ
justingordon

คำตอบ:


123

จากbashหน้าคน:

HISTCONTROL

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

ดังนั้นใส่บรรทัดต่อไปนี้ในของคุณ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


คุณต้องการให้ฉันเพิ่ม HISTCONTROL = ไม่สนใจทั้งสองที่ด้านล่างของ ~ / .bashrc หรือไม่?
karthick87

1
@ คาร์ทิคมันไม่สำคัญว่าคุณจะวางไว้ที่ใด
อิสยาห์

ในการติดตั้ง Ubuntu 12.04 ของฉันฉันต้องทำการปรับเปลี่ยนนี้ใน~/.bash_loginเกือบตลอดเวลามันจะทำงานถ้า. bashrc มีการปรับเปลี่ยน แต่นั่นไม่ใช่กรณีตลอดเวลา
ck-

3
อย่าลืมเรียกใช้สิ่งเหล่านี้หลังจากที่คุณอัปเดต bash profile / ไฟล์ rc -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

ติดสิ่งนี้ในของคุณ~/.bashrc:

export HISTCONTROL=ignoredups

ignorebothคุณสามารถใช้แทน มันเป็นการย่อทั้งignorespaces(คำสั่งที่ขึ้นต้นด้วยช่องว่าง) และignoredups(ซ้ำกัน)

ฉันชอบignoredupsด้วยตัวเองเพราะฉันพบว่าพฤติกรรมเริ่มต้นของการเพิกเฉยคำสั่งที่มีช่องว่างด้านหน้าค่อนข้างน่ารำคาญเมื่อฉันคัดลอกคำสั่งออกจากเว็บไซต์และมันไม่ได้รับการบันทึกเพราะฉันตั้งใจคัดลอกในพื้นที่เกินไป .... แต่ แต่ละของพวกเขาเอง


3
ยังคงมีอยู่ซ้ำ .. อาจมีปัญหาอะไร? imgur.com/fXeLQ.png
karthick87

5
@ karthick87 อ้างจากคำตอบอื่น: ค่าของignoredupsเส้นสาเหตุที่ตรงกับรายการก่อนประวัติศาสตร์ที่จะไม่ถูกบันทึกไว้ มันจะลบเส้นที่เหมือนกันตามลำดับเท่านั้น
อัล

10

การใส่สิ่งนี้ลงใน~/.bashrcจะใช้โซลูชันของ @ alvin ในเซสชันต่างๆเป็น wlell

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

แหล่งที่มา: Linux: ประวัติทุบตี:“ การเพิกเฉย” และ“ การลบ” การตั้งค่าขัดแย้งกับประวัติทั่วไปทั่วเซสชัน


ทำไมการใช้งานของเขาexport HISTCONTROLและของคุณไม่ถึง ความแตกต่างคืออะไร? มันทำงานสำหรับฉันโดยไม่ส่งออกฉันแค่อยากรู้อยากเห็น
felwithe

1
คำถามที่ดี! ฉันต้องการทราบคำตอบด้วย โดยทั่วไปexportทำให้ตัวแปรพร้อมใช้งานสำหรับกระบวนการย่อย stackoverflow.com/q/1158091/552621ในกรณีของHISTCONTROL, PROMPT_COMMANDฯลฯ ตัวแปรเหล่านี้ถูกใช้โดยเชลล์เองดังนั้นอาจจะไม่จำเป็นต้องเอ็กซ์พอร์ตพวกมัน (ไปยังกระบวนการลูก)
Nour Wolf


3

เพิ่มสิ่งต่อไปนี้ในของคุณ~/.bashrc:

export HISTCONTROL=ignoredups

หากต้องการทำสิ่งนี้คุณสามารถใช้คำสั่งนี้:

nano ~/.bashrc

0

ในการบันทึกคำสั่งใหม่ทุกคำสั่งนั้นไม่ยุ่งยาก ก่อนอื่นคุณต้องเพิ่ม ~/.profileหรือคล้ายกัน:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

จากนั้นคุณต้องเพิ่มใน~/.bash_logout:

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