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).
historyperintah 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 -nmemiliki berada di sana sebelumhistory -wuntuk membaca dari.bash_historyperintah yang disimpan dari terminal lain, -
history -wmemiliki berada di sana untuk menyimpan riwayat baru ke file setelah bash memeriksa apakah perintahnya adalah duplikat, -
history -atidak boleh ditempatkan di sana alih-alihhistory -w, karena itu akan menambahkan ke file perintah baru, terlepas dari apakah itu dicentang sebagai duplikat. -
history -cjuga dibutuhkan karena mencegah pengrusakan buffer riwayat setelah setiap perintah, -
dan terakhir,
history -rdibutuhkan 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.