Pertama-tama, ini bukan duplikat utas yang ada di SE. Saya telah membaca dua utas ini ( 1 , 2 ) tentang sejarah bash yang lebih baik, tetapi tidak ada jawaban yang berhasil - - Saya menggunakan Fedora 15.
Saya menambahkan yang berikut ke .bashrc
file di direktori pengguna (/ home / aahan /), dan tidak berfungsi. Adakah 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 inilah yang saya inginkan dengan bash history (prioritas):
- jangan menyimpan duplikat, hapus yang sudah ada
- segera bagikan riwayat dengan semua terminal terbuka
- selalu menambahkan riwayat, bukan menimpanya
- menyimpan perintah multi-line sebagai satu perintah (yang tidak aktif secara default)
- apa ukuran Riwayat standar dan ukuran file riwayat?
bash
command-history
ini aku
sumber
sumber
echo $SHELL
). Apakah pengaturan bekerja jika Anda menjalankannya secara manual dari shell terbuka Anda? Jelas karena mereka bekerja untuk banyak orang lain pengaturannya benar, Anda hanya salah mengimplementasikannya. Dan tidak ada Fedora15 / Gnome3 / menjadi mesin virtual tidak ada hubungannya dengan fungsi sebenarnyabash
..bashrc
file. Apakah itu salah? Bisakah Anda menambahkan "jawaban" ke posting ini dengan perintah shell yang sebenarnya? (tolong tahan dengan noob-ity saya.).bashrc
ADALAH perintah shell aktual. Skrip hanyalah serangkaian perintah shell. Juga edit yang baru-baru ini Anda buat menghapusexport
bit adalah ide yang buruk, yang harus disimpan.Jawaban:
Ini sebenarnya adalah perilaku yang sangat menarik dan saya akui saya telah terlalu meremehkan pertanyaan di awal. Tapi pertama-tama faktanya:
1. Apa yang berhasil
Fungsionalitas dapat dicapai dalam beberapa cara, meskipun masing-masing bekerja sedikit berbeda. Perhatikan bahwa, dalam setiap kasus, untuk memiliki sejarah "ditransfer" ke terminal lain (diperbarui), kita harus menekan Enterdi terminal, di mana ia ingin mengambil sejarah.
Pilihan 1:
Ini memiliki dua kelemahan:
pilihan 2:
(Ya, tidak perlu
shopt -s histappend
dan ya, harushistory -c
di tengah-tengahPROMPT_COMMAND
) Versi ini juga memiliki dua kelemahan penting:history
perintah dapat memberikan output yang salah - lihat di bawah.[Sunting] "Dan pemenangnya adalah ..."
opsi 3:
Ini sejauh yang didapat. Ini adalah satu - satunya pilihan untuk memiliki keduanya
erasedups
dan riwayat umum yang bekerja secara bersamaan. Ini mungkin solusi terakhir untuk semua masalahmu, Aahan.2. Mengapa opsi 2 tampaknya tidak berfungsi (atau: apa yang sebenarnya tidak berfungsi seperti yang diharapkan)?
Seperti yang saya sebutkan, masing-masing solusi di atas bekerja secara berbeda. Tetapi interpretasi yang paling menyesatkan tentang bagaimana pengaturan bekerja berasal dari menganalisis output dari
history
perintah . Dalam banyak kasus, perintah dapat memberikan output yang salah . Mengapa? Karena itu dieksekusi sebelum urutanhistory
perintah lain yang terkandung dalamPROMPT_COMMAND
! Namun, ketika menggunakan opsi kedua atau ketiga, seseorang dapat memantau perubahan.bash_history
konten (menggunakanwatch -n1 "tail -n20 .bash_history"
misalnya) dan melihat apa sejarah sebenarnya.3. Mengapa opsi 3 begitu rumit?
Itu semua terletak pada cara
erasedups
kerjanya. Seperti yang dinyatakan oleh manual bash, "(...)erasedups
menyebabkan semua baris sebelumnya yang cocok dengan baris saat ini dihapus dari daftar riwayat sebelum baris itu disimpan" . Jadi ini benar-benar yang diinginkan OP (dan bukan hanya, seperti yang saya pikirkan sebelumnya, agar tidak ada duplikat yang muncul secara berurutan ) . Inilah mengapa masing-masinghistory -.
perintah harus atau tidak bisa diPROMPT_COMMAND
:history -n
memiliki untuk berada di sana sebelumhistory -w
membaca dari.bash_history
perintah disimpan dari setiap terminal lain,history -w
memiliki untuk berada di sana untuk menyelamatkan sejarah untuk mengajukan dan menghapus duplikat,history -a
tidak boleh ditempatkan di sana, bukanhistory -w
, karena itu tidak memicu menghapus duplikat,history -c
juga diperlukan karena mencegah membuang buffer sejarah setelah setiap perintah,dan akhirnya,
history -r
yang diperlukan untuk mengembalikan buffer sejarah dari file, sehingga akhirnya membuat sejarah bersama seluruh sesi terminal.sumber
watch "tail -n 20 .bash_history"
daripadatail -f .bash_history
.history -c
juga diperlukan karena mencegah membuang buffer sejarah setelah setiap perintah. Mengapa pemotongan ini terjadi?Dalam perintah prompt Anda, Anda menggunakan
-c
sakelar. Dariman bash
:Untuk membagikan riwayat Anda dengan semua terminal terbuka, Anda dapat menggunakan
-n
:Ukuran standar juga ada di manual:
Untuk menyimpan perintah multi-line:
Selain itu, Anda tidak boleh mengawali perintah HIST * dengan
export
- itu adalah variabel bash-only bukan variabel lingkungan:HISTCONTROL=ignoredups:erasedups
sudah cukup.sumber
export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"
benar? Juga, apakah Anda tahu bagaimana saya bisa membuat file riwayat menyimpan perintah multi-line sebagai satu perintah (yang tidak aktif secara default) ??shopt -s cmdhist
akan menghemat banyak baris.HISTCONTROL=ignoredups:erasedups
tidak berfungsi. Saya juga mencoba hanya dengan itu di.bashrc
file (antara fungsi kustom). Adakah yang tahu apa yang salah? Saya menggunakan Fedora 15 pada mesin virtual - - host Windows 7./etc/bashrc
,.bash_profile
dll yang menimpanya..bash_profile
file tersebut. Adapun konten di/etc/bashrc
saya taruh di sini, silakan lihat - pastebin.com/Uae6sE6sInilah yang saya buat dan saya senang dengan itu sejauh ini ...
CATATAN:
HISTIGNORE
mengabaikan semua perintah yang tidak memiliki argumen. Ini mungkin tidak diinginkan oleh beberapa orang dan dapat ditinggalkan.sumber
Gunakan ini sebagai gantinya:
sumber
Ini tidak berfungsi, karena Anda lupa tentang:
Tapi sepertinya
history -n
hanya buggy saatexport HISTCONTROL=ignoreboth:erasedups
berlaku.Mari kita bereksperimen:
Di sini kita menghidupkan dups menghapus, beralih histori ke file kustom, menghapus histori. Setelah semua perintah selesai, kami memiliki file riwayat kosong dan satu perintah di riwayat saat ini.
Buka terminal kedua dan jalankan enam perintah itu juga. Setelah itu:
Sekarang riwayat Anda saat ini memiliki dua perintah dan file riwayat memiliki:
Kembali ke terminal pertama:
Hah ... tidak ada
echo
perintah yang dibaca. Beralih lagi ke terminal kedua dan:Sekarang file histori adalah:
Beralih ke terminal pertama lagi:
Anda dapat melihat bahwa
echo "Z"
perintah digabungkan kehistory -n
.Bug lain adalah karena perintah dibaca dari sejarah dengan nomor perintah dan bukan oleh waktu perintah, saya pikir. Saya berharap
echo
perintah lain muncul di historisumber
erasedups tidak memangkas (seperti chomp dalam beberapa bahasa) ruang utama dan tambahan. Ini adalah bug. Juga terhapus tidak menghapus semua entri sebelumnya.
sumber