Pertama-tama, ini bukan duplikat dari utas yang ada di SE. Saya telah membaca dua utas ini (1, 2) tentang riwayat bash yang lebih baik, tetapi tidak ada jawaban yang berhasil – – ngomong-ngomong, saya menggunakan Fedora 15.
Saya menambahkan yang berikut ini ke .bashrc
file di direktori pengguna (/home/aahan/), dan tidak berfungsi. Ada yang punya petunjuk?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
Oke ini yang saya inginkan dengan riwayat bash (prioritas):
- jangan simpan duplikat, hapus yang sudah ada
- segera bagikan riwayat dengan semua terminal yang terbuka
- selalu tambahkan riwayat, jangan ditimpa
- menyimpan perintah multi-baris sebagai satu perintah (yang dinonaktifkan secara default)
- berapa ukuran default History dan ukuran file history?
Jawaban yang Diterima:
Ini sebenarnya perilaku yang sangat menarik dan saya akui saya sangat meremehkan pertanyaan di awal. Tapi pertama-tama faktanya:
1. Apa yang berhasil
Fungsionalitas dapat dicapai dengan beberapa cara, meskipun masing-masing bekerja sedikit berbeda. Perhatikan bahwa, dalam setiap kasus, agar riwayat “ditransfer” ke terminal lain (diperbarui), seseorang harus menekan Enter di terminal, tempat dia ingin mengambil riwayat.
-
opsi 1:
shopt -s histappend HISTCONTROL=ignoredups PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"
Ini memiliki dua kelemahan:
- Saat login (membuka terminal), perintah terakhir dari file histori dibaca dua kali ke buffer histori terminal saat ini;
- Buffer dari terminal yang berbeda tidak tetap sinkron dengan file riwayat.
-
opsi 2:
HISTCONTROL=ignoredups PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
(Ya, tidak perlu shopt -s histappend
dan ya, itu harus history -c
di tengah PROMPT_COMMAND
)
Versi ini juga memiliki dua kelemahan penting:
- Berkas riwayat harus diinisialisasi. Itu harus berisi setidaknya satu baris tidak kosong (bisa apa saja).
history
perintah dapat memberikan keluaran yang salah – lihat di bawah.
[Sunting] “Dan pemenangnya adalah…”
-
opsi 3:
HISTCONTROL=ignoredups:erasedups shopt -s histappend PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
Ini sejauh yang didapat. Ini adalah satu-satunya opsi untuk memiliki erasedups
dan sejarah umum bekerja secara bersamaan. Ini mungkin adalah solusi akhir untuk semua masalahmu, Aahan.
2. Mengapa opsi 2 sepertinya tidak berhasil (atau:apa yang sebenarnya tidak bekerja seperti yang diharapkan)?
Seperti yang saya sebutkan, masing-masing solusi di atas bekerja secara berbeda. Namun interpretasi yang paling menyesatkan tentang cara kerja setelan berasal dari analisis keluaran history
perintah . Dalam banyak kasus, perintah dapat memberikan false keluaran. Mengapa? Karena dieksekusi sebelum urutan history
lainnya perintah yang terdapat dalam PROMPT_COMMAND
! Namun, saat menggunakan opsi kedua atau ketiga, seseorang dapat memantau perubahan .bash_history
konten (menggunakan watch -n1 "tail -n20 .bash_history"
misalnya) dan lihat apa sejarah sebenarnya.
3. Mengapa opsi 3 sangat rumit?
Semuanya terletak pada cara erasedups
bekerja. Seperti yang dinyatakan oleh bash manual, “(…) erasedups
menyebabkan semua baris sebelumnya yang cocok dengan baris saat ini dihapus dari daftar riwayat sebelum baris tersebut disimpan” . Jadi inilah yang benar-benar diinginkan OP (dan bukan hanya, seperti yang saya duga sebelumnya, tidak ada duplikat yang muncul secara berurutan ) . Inilah mengapa masing-masing history -.
perintah harus atau tidak boleh ada di PROMPT_COMMAND
:
-
history -n
memiliki berada di sana sebelumhistory -w
untuk membaca dari.bash_history
perintah yang disimpan dari terminal lain, -
history -w
memiliki berada di sana untuk menyimpan riwayat baru ke file setelah bash memeriksa apakah perintahnya adalah duplikat, -
history -a
tidak boleh ditempatkan di sana alih-alihhistory -w
, karena itu akan menambahkan ke file perintah baru, terlepas dari apakah itu dicentang sebagai duplikat. -
history -c
juga dibutuhkan karena mencegah pengrusakan buffer riwayat setelah setiap perintah, -
dan terakhir,
history -r
dibutuhkan untuk memulihkan buffer histori dari file, sehingga akhirnya membuat histori dibagikan di seluruh sesi terminal.
Ketahuilah bahwa solusi ini akan mengacaukan urutan riwayat dengan meletakkan semua riwayat dari terminal lain di depan perintah terbaru yang dimasukkan di terminal saat ini. Itu juga tidak menghapus baris duplikat yang sudah ada di file riwayat kecuali Anda memasukkan perintah itu lagi.