Cara menghindari entri duplikat di .bash_history


108

Perintah yang sama tercantum dalam histori saya berulang kali. Bagaimana saya bisa menghindari ini? Saya tahu itu mungkin terjadi HISTCONTROLtetapi saya belum menemukan cara yang benar.


Saya membuat pertanyaan terkait: askubuntu.com/questions/205520/… . Dups dalam riwayat berguna untuk melihat konteks dari suatu perintah. Apa yang ingin Anda hilangkan dups terkadang ketika Anda mencetak sejarah.
justingordon

Jawaban:


123

Dari bashhalaman manual:

HISTCONTROL

Daftar nilai yang dipisahkan oleh titik dua yang mengendalikan bagaimana perintah disimpan pada daftar riwayat. Jika daftar nilai termasuk ignorespace, garis yang dimulai dengan karakter spasi tidak disimpan dalam daftar riwayat. Nilai ignoredupsgaris penyebab yang cocok dengan entri riwayat sebelumnya tidak disimpan. Nilai ignorebothadalah singkatan untuk ignorespace dan ignoredups. Nilai darierasedupsmenyebabkan semua baris sebelumnya yang cocok dengan baris saat ini dihapus dari daftar riwayat sebelum baris itu disimpan. Nilai apa pun yang tidak ada dalam daftar di atas diabaikan. Jika HISTCONTROL tidak disetel, atau tidak menyertakan nilai yang valid, semua baris yang dibaca oleh parser shell disimpan pada daftar histori, tunduk pada nilai HISTIGNORE. Baris kedua dan selanjutnya dari perintah majemuk multi-baris tidak diuji, dan ditambahkan ke histori terlepas dari nilai HISTCONTROL.

Jadi, letakkan baris berikut di Anda ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


Apakah Anda ingin saya menambahkan HISTCONTROL = ignoreboth di bagian bawah ~ / .bashrc?
karthick87

1
@arthick Tidak masalah di mana Anda meletakkannya, bagian bawah baik-baik saja.
Yesaya

Pada instalasi Ubuntu 12.04 saya, saya harus membuat modifikasi ini di sebagian ~/.bash_loginbesar waktu itu akan berfungsi jika. Bashrc dimodifikasi tapi itu tidak terjadi sepanjang waktu.
ck-

3
Jangan lupa untuk menjalankan ini setelah Anda memperbarui file bash profile / rc Anda -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

Tempelkan ini di ~/.bashrc:

export HISTCONTROL=ignoredups

Anda bisa menggunakan ignoreboth. Ini singkatan untuk keduanya ignorespaces(perintah dimulai dengan spasi) dan ignoredups(duplikat).

Saya lebih suka ignoredupssendiri karena saya menemukan perilaku default mengabaikan perintah dengan spasi di depan cukup menjengkelkan ketika saya menyalin perintah dari situs web dan itu tidak disimpan karena saya tidak sengaja menyalin di spasi juga .... Tapi untuk masing-masing sendiri.


3
Masih ada duplikat .. Apa masalahnya? imgur.com/fXeLQ.png
karthick87

5
@ karthick87 dikutip dari jawaban lain: Nilai ignoredupsgaris penyebab yang cocok dengan entri riwayat sebelumnya tidak disimpan . Itu hanya menghilangkan garis identik yang berurutan.
AL

10

Memasukkan ini ~/.bashrcakan menerapkan solusi @ alvin di berbagai sesi sebagai wlell

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

Sumber: Linux: Bash history: "ignoredups" dan "erasedups" mengatur konflik dengan histori umum lintas sesi


Mengapa dia menggunakan export HISTCONTROLdan milikmu tidak? Apa bedanya? Ini bekerja untuk saya tanpa ekspor, saya hanya ingin tahu
felwithe

1
Pertanyaan bagus! Saya juga ingin tahu jawabannya. Secara umum exportmembuat variabel tersedia untuk sub-proses. stackoverflow.com/q/1158091/552621 Dalam kasus HISTCONTROL, PROMPT_COMMANDdll, variabel ini digunakan oleh shell itu sendiri jadi mungkin mengekspor mereka (anak-anak proses) tidak diperlukan.
Nour Wolf


3

Tambahkan yang berikut ke Anda ~/.bashrc:

export HISTCONTROL=ignoredups

Untuk melakukan ini, Anda dapat menggunakan perintah ini:

nano ~/.bashrc

0

Untuk merekam secara unik setiap perintah baru itu rumit. Pertama, Anda perlu menambahkan ~/.profileatau serupa:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Maka Anda perlu menambahkan ~/.bash_logout:

history -a
history -w
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.