Saya sangat menikmati menggunakan control+r
secara rekursif mencari riwayat perintah saya. Saya telah menemukan beberapa opsi bagus yang ingin saya gunakan:
# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace
# keep the last 5000 entries
export HISTSIZE=5000
# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend
Satu-satunya masalah bagi saya adalah bahwa erasedups
hanya menghapus duplikat berurutan - sehingga dengan serangkaian perintah ini:
ls
cd ~
ls
The ls
perintah akan benar-benar disimpan dua kali. Saya sudah berpikir tentang menjalankan w / cron secara berkala:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Ini akan mencapai penghapusan duplikat, tetapi sayangnya pesanan tidak akan dipertahankan. Jika saya tidak sort
file terlebih dahulu saya tidak percaya uniq
bisa berfungsi dengan baik.
Bagaimana saya bisa menghapus duplikat di .bash_history saya, menjaga ketertiban?
Kredit tambahan:
Apakah ada masalah dengan menimpa .bash_history
file melalui skrip? Sebagai contoh, jika Anda menghapus file log apache saya pikir Anda perlu mengirim sinyal nohup / reset dengan kill
itu flush itu koneksi ke file. Jika demikian halnya dengan .bash_history
file, mungkin saya entah bagaimana dapat menggunakan ps
untuk memeriksa dan memastikan tidak ada sesi yang terhubung sebelum skrip penyaringan dijalankan?
ignoredups
alih-aliherasedups
sebentar dan lihat bagaimana itu bekerja untuk Anda.history
perintah. Di mana saya harus mencari?Jawaban:
Menyortir sejarah
Perintah ini bekerja seperti
sort|uniq
, tetapi menjaga garis di tempatnyaPada dasarnya, tambahkan setiap baris ke nomornya. Setelah
sort|uniq
-ing, semua baris diurutkan kembali sesuai dengan urutan aslinya (menggunakan bidang nomor baris) dan bidang nomor baris dihapus dari garis.Solusi ini memiliki kekurangan bahwa tidak ditentukan perwakilan kelas yang mana dari garis yang sama yang akan membuatnya dalam output dan oleh karena itu posisinya dalam output akhir tidak ditentukan. Namun, jika perwakilan terbaru harus dipilih, Anda dapat
sort
memasukkan dengan kunci kedua:Mengelola .bash_history
Untuk membaca dan menulis kembali sejarah, Anda dapat menggunakan
history -a
danhistory -w
masing - masing.sumber
sort
,-r
sakelar selalu membalik urutan penyortiran. Tetapi ini tidak akan menghasilkan hasil yang Anda pikirkan.sort
menganggap dua kejadianls
identik dengan hasil yang, bahkan ketika dibalik, urutan akhirnya tergantung pada algoritma pengurutan. Tetapi lihat pembaruan saya untuk ide lain.nl
di awal setiap baris kode? Bukankah seharusnya begituhistory
?Jadi saya mencari hal yang persis sama setelah terganggu oleh duplikat, dan menemukan bahwa jika saya mengedit ~ / .bash_profile (Mac) saya dengan:
Itu tidak persis apa yang Anda inginkan, itu hanya membuat perintah terbaru.
ignoreboth
sebenarnya hanya suka melakukanignorespace:ignoredups
dan itu bersamaan denganerasedups
menyelesaikan pekerjaan.Setidaknya di terminal Mac saya dengan bash ini berfungsi dengan sempurna. Ditemukan di sini di askubuntu.com .
sumber
Temukan solusi ini di alam liar dan teruji:
Pertama kali nilai spesifik garis ($ 0) terlihat, nilai x [$ 0] adalah nol.
Nilai nol dibalik dengan
!
dan menjadi satu.Pernyataan yang mengevaluasi ke satu menyebabkan tindakan default, yang dicetak.
Oleh karena itu, pertama kali spesifik
$0
terlihat, itu dicetak.Setiap waktu berikutnya (pengulangan) nilai
x[$0]
telah bertambah,nilai negasinya adalah nol, dan pernyataan yang mengevaluasi nol tidak dicetak.
Untuk menjaga nilai berulang yang terakhir, balikkan sejarah dan gunakan awk yang sama:
sumber
Memperluas jawaban Clayton:
tac
balikkan file, pastikan Anda telah menginstalmoreutils
sehingga Anda telahsponge
tersedia, jika tidak gunakan file temp.sumber
brew install coreutils
, dan perhatikan bahwa semua util GNU memiliki kemampuang
untuk menghindari kebingungan dengan perintah Mac bawaan BSD (mis. Gsed adalah GNU sedangkan sed adalah BSD). Jadi gunakangtac
.Ini akan menjaga baris yang digandakan terakhir:
sumber
Ini adalah posting lama, tetapi merupakan masalah abadi bagi pengguna yang ingin memiliki beberapa terminal terbuka, dan memiliki sejarah yang disinkronkan di antara windows, tetapi tidak diduplikasi.
Solusi saya di .bashrc:
history -n
membaca semua baris dari $ HISTFILE yang mungkin terjadi di terminal berbeda sejak carriage return terakhirhistory -w
menulis buffer yang diperbarui ke $ HISTFILEhistory -c
menyeka buffer sehingga tidak terjadi duplikasihistory -r
baca kembali $ HISTFILE, tambahkan ke buffer yang sekarang kosongtac
membalikkannya, lalu membalikkannya kembali sehingga dapat disimpan dengan perintah terbaru yang paling baru dalam sejarahSetiap kali Anda membuka shell baru, histori memiliki semua dupes dihapus, dan setiap kali Anda menekan Enterkunci di jendela shell / terminal yang berbeda, itu memperbarui sejarah ini dari file.
sumber
Untuk merekam secara unik setiap perintah baru itu rumit. Pertama, Anda perlu menambahkan
~/.profile
atau serupa:Maka Anda perlu menambahkan
~/.bash_logout
:sumber