Mungkinkah segera membuat tulisan ke .bash_history?

125

Saya sering membuka banyak Terminal [Saat ini saya sudah membuka 7 di ruang kerja ini] dan saya sering mencari historydengan grepmenemukan perintah yang baru saja saya tulis, tapi saya tidak ingin memburu terminal dan kemudian gulir ke atas dan berburu lebih banyak, dll. Kadang-kadang terminal saya tutup tanpa 'keluar,' dan semua yang saya tulis hilang [Kadang-kadang saya membutuhkan sesuatu yang saya tulis di terminal yang terbunuh].

Jadi apakah ada cara untuk membuatnya sehingga setiap terminal segera menulis ke .bash_history? atau setidaknya satu menit, atau sesuatu seperti itu?

Mat
sumber
2
Biasanya saya gunakan control-runtuk melakukan pencarian terbalik dalam sejarah perintah dari satu bash. Lebih nyaman daripada history | grepkecuali Anda membutuhkan regex.
Peter Cordes

Jawaban:

93

Solusi sederhana seperti yang dijelaskan dalam Perbarui Bash History secara Realtime .

Dikatakan untuk menempatkan perintah-perintah itu di .bashrc config:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

Perintah pertama mengubah .historymode file untuk ditambahkan. Dan yang kedua mengkonfigurasi history -aperintah yang akan dijalankan pada setiap prompt shell. The -asegera menulis garis saat ini / baru ke file sejarah.

Terkait untuk zsh:

mario
sumber
1
nah jenis pekerjaan ini. Saya mencoba beberapa pengujian lagi dan sepertinya hanya bekerja pada perintah pertama. apakah itu bekerja dengan baik untuk Anda?
Matt
55

Coba masukkan ini ke .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Kredit di sini: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cmembersihkan riwayat sesi lari. Ini akan mengurangi penghitung riwayat dengan jumlah $HISTSIZE. history -rbaca konten $HISTFILEdan masukkan ke riwayat sesi berjalan saat ini. Ini akan meningkatkan penghitung sejarah dengan jumlah baris di $HISTFILE.

Saya pikir itu berarti bahwa perintah tersedia segera (Anda memiliki satu terminal, tulis echo 1, terminal kedua echo 2, pertama echo 3dan setelah menekan panah dua kali, Anda harus sudah echo 2tersedia. Anda harus mengeluarkan perintah di terminal yang diberikan untuk memiliki akses ke apa yang telah telah ditulis.

sup
sumber
Cemerlang! Terima kasih. Bertanya-tanya mengapa opsi-opsi itu tidak didokumentasikan di man history...
artfulrobot
10
@artfulrobot: Perintah ini adalah bashbuilt-in sehingga dijelaskan dalam man bash. Anda juga bisa menggunakan help history.
pabouk
2
Saya telah mengonfigurasi zsh saya agar berfungsi seperti ini: Setiap shell melacak sejarahnya SENDIRI (dan sebelum itu, histori gabungan), dan setiap perintah ditambahkan ke histori gabungan. Ini berbeda dan lebih baik daripada selalu memuat ulang sejarah untuk setiap perintah untuk setiap shell, karena saya cenderung memiliki "utas kerja" atau "pekerjaan" yang berbeda untuk setiap terminal shell. Saya pikir itu adalah perbedaan antara memiliki -rdan -cvs hanya memiliki -a.
Steven Lu
Jadi apa sebenarnya yang Anda gunakan? history -c; history -r? Saya kira itu lebih baik untuk Anda, akan lebih baik bagi saya hanya kadang-kadang, saya sering menggunakan beberapa kerang untuk melakukan satu pekerjaan, jadi saya lebih suka memiliki sejarah sebanyak mungkin digabungkan. Saya sebenarnya keberatan bahwa perintah hanya ditulis untuk sejarah setelah selesai. biasanya, ketika saya memulai sesi ssh ke satu host dan ingin membuka yang lain ketika yang pertama masih berjalan, saya harus mengetik ulang karena belum ditulis ke histori.
sup
Saya pikir saya tidak pernah bertahan cukup lama untuk mencari tahu bagaimana membuat bash secara bersamaan melacak thread paralel sejarah (per basis contoh shell) sambil segera menulis sejarah ke file sejarah utama. Zsh membuatnya lebih mudah untuk melakukannya, ditambah lagi saya telah mendefinisikan fungsi zsh untuk menulis banyak metadata mewah ke file riwayat-disempurnakan yang saya buat. Itu menjadi sangat diperlukan. Bagaimanapun, mekanisme di sana adalah precmd () dan preexec () untuk zsh mendapatkan argumen yang menjelaskan perintah yang dimasukkan. Kemudian menjadi sepele untuk mengarahkannya ke file. history -amungkin sudah cukup
Steven Lu
38

Saya memiliki file histori besar dengan sekitar 100.000 entri, dan varian yang menghapus daftar histori dan membaca seluruh file histori (menggunakan history -cdan history -r) memperkenalkan penundaan yang nyata (mungkin 0,2 detik) sebelum prompt ditampilkan. Menggunakan history -nsehingga hanya baris baru yang dibaca dari file histori lebih cepat:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND tidak harus diekspor karena ini adalah variabel shell.

nisetama
sumber
Cemerlang! Tidak ada lagi riwayat yang hilang saat koneksi terputus!
Tobia
Ini luar biasa. Dengan menambahkan ke file dan membaca dari file, itu akan berbagi sejarah di beberapa terminal.
wisbucky
3

Catatan untuk semua jawaban lain (yang pada dasarnya adalah hal yang sama):

Pengaturan PROMPT_COMMAND="history -a;$PROMPT_COMMAND"di .bashrc(atau teman) sudah cukup.

Selain itu, Anda dapat menjalankan secara manual history -akapan pun Anda ingin "memotret" riwayat di sesi saat ini.

Perintah shopt -s histappendini tidak diperlukan karena history -aselalu menambahkan baris baru ke file dan tidak pernah menimpanya. Juga, setidaknya pada Bash 4, histappendadalah perilaku default.

Guss
sumber
Di mac saya 10.13.6 sepertinya tidak bekerja tanpa shopt -s histappend. Juga perhatikan saya menambahkannya ke~/.bash_profile
ubershmekel
Kemungkinan ada pengaturan lain di suatu tempat di sistem Anda yang dinonaktifkan histappend, karena itu adalah perilaku default. Saya akan mencarinya, tetapi saya tidak memiliki akses ke Mac.
Guss