Bash history handling dengan beberapa terminal

110

Saya menggunakan Terminator, dan biasanya dibuka dengan 3 terminal windows terpisah. Saya juga menggunakan terminal Gnome karena berbagai alasan.
Saya bertanya-tanya bagaimana bash history ditangani dalam kasus ini karena saya kadang-kadang kehilangan perintah yang dikeluarkan sebelumnya ketika saya menjalankanhistory

Sebagai contoh, prompt saya menunjukkan baris bash history saat ini ( \!) dan jika saya meluncurkan Terminator dengan 3 terminal windows terpisah saya mendapatkan baris histori yang sama (misalkan 100) pada semua terminal. Sejarah mana yang akan disimpan?

Juga meluncurkan Terminal Gnome setelah menggunakan Terminator Saya mendapatkan jalur 100 saat startup terlepas dari semua perintah yang dikeluarkan sebelumnya di Terminator

zetah
sumber

Jawaban:

107

Sesi bash yang disimpan adalah yang untuk terminal yang ditutup terbaru. Jika Anda ingin menyimpan perintah untuk setiap sesi, Anda bisa menggunakan trik yang dijelaskan di sini .

export PROMPT_COMMAND='history -a'

Mengutip halaman manual: "Jika diatur, nilai dieksekusi sebagai perintah sebelum mengeluarkan setiap prompt utama."

Jadi setiap kali perintah saya selesai, ia menambahkan item riwayat tidak tertulis ~/.bash_historysebelum menampilkan prompt (hanya $ PS1) lagi.

Jadi setelah memasukkan kalimat itu ke dalam, /etc/bash.bashrcsaya tidak harus menemukan diri saya menemukan kembali roda atau kehilangan detik berharga mengetik ulang hanya karena saya malas dengan terminal saya.

Bagaimanapun, Anda harus mempertimbangkan bahwa perintah dari sesi yang berbeda akan dicampur dalam file riwayat Anda sehingga tidak akan begitu mudah untuk membacanya nanti.

Lihat juga:

jcollado
sumber
bukankah itu disimpan secara terpisah untuk TTL yang berbeda ??
Vineet Menon
Luar biasa. Terima kasih atas penjelasan dan solusinya. Saya mencoba dengan export PROMPT_COMMAND='history -a; history -r'dan saya mendapat beberapa nomor garis sejarah yang aneh di terminal - setelah mengeluarkan beberapa nomor baris sejarah perintah melompat pada tahun 2000 bukan oleh 1, yang aneh tapi berperilaku seperti yang dikatakan - semua terminal sejarah disimpan.
zetah
@VineetMenon Untuk lebih jelasnya lihat di sini . Bagian yang menarik: Ketika shell dijalankan, histori diinisialisasi dari file yang dinamai oleh variabel HISTFILE (default `~ / .bash_history '). [...] Ketika shell interaktif keluar, $ HISTSIZE baris terakhir disalin dari daftar riwayat ke file bernama $ HISTFILE.
jcollado
Situs web ini kelihatannya surut: northernmost.org/blog/flush-bash_history-after-each-command
Shubham
32

Setelah beberapa bacaan man bash, saya menggunakan file histori terpisah untuk setiap shell. Saya mkdir -m 0700 ~/.historykemudian menambahkan

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

untuk saya ~/.bashrc. Sesekali, saya ingat du -sk .historydan bersihkan. Sangat menyenangkan memiliki setiap perintah yang saya ketikkan disimpan untuk saya.

Saya hanya menggunakan hal di atas untuk melihat apa yang telah saya lakukan, akhir-akhir ini:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
atau
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(untuk memasukkan argumen 1 misalnya sudo mountdalam rantai pengurutan).

waltinator
sumber
3
Mengapa Anda menetapkan HISTFILESIZEdua kali?
Daniel
2
Dengan mengatur HISTFILESIZE ke 0, saya menghapus buffer histori dan mereset mekanisme penyimpanan histori. Lalu, saya mengatur ukuran yang saya inginkan, dan mulai menyimpan riwayat di HISTFILE. Lihat bagian SEJARAH man bash.
waltinator
1
apakah ada cara untuk menggabungkan file histori agar dapat Ctrl+rberfungsi kembali?
n611x007
3
Ini seharusnya menjadi pertanyaan baru, tapi saya pikir itu bukan Ide yang Baik. Saya menggunakan egrep 'whatever' .history/*(atau cat .history/* | egrep 'whatever') sebagai gantinya, dan menggunakan Ctrl-r untuk mencari riwayat sesi individu. Baca man bash-builtinstentang perintah sejarah. sort .history/* | uniq -c | sort -n | wc -lAcara saya menunjukkan 16033 perintah unik, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nmenunjukkan perintah unik 2004, sebagian besar kesalahan ketik. Memuat semua itu ke "daftar riwayat" bash tidak akan membantu.
waltinator
@waltinator - saya tahu ini adalah komentar lama, tetapi apakah Anda menyiratkan bahwa pengaturan variabel lingkungan entah bagaimana memicu tindakan segera? proses apa yang akan mengambil fakta bahwa Anda menetapkan nilai 0 ke HISTFILESIZE di shell lokal dan kemudian segera berubah menjadi 4096? Apakah ini sesuatu yang tidak berdokumen tentang penanganan bash terhadap nama variabel tertentu?
disinkronkan
8

Untuk ditampilkan historydari semua terminal:

Tambahkan export PROMPT_COMMAND='history -a; history -r'ke file .bashrc Anda.

Sumber: http://northernmost.org/blog/flush-bash_history-after-each-command


Elijah Lynn
sumber
3
Saya akan mengatakan bahwa setelah beberapa bulan menggunakan ini saya akhirnya berkomentar baru-baru ini. Ini pahit karena saya tidak selalu ingin menyaring 100 perintah terakhir hanya untuk menjalankan yang awalnya saya jalankan di panel Tmux saya kadang-kadang mungkin memiliki perintah log khusus di bahwa saya perlu me-restart.
Elijah Lynn
Solusi bagus yang ditawarkan cangkang ikan adalah a history --merge. Saya telah menggunakan ini selama satu tahun atau lebih sekarang dan itu memecahkan masalah. Ketika saya ingin riwayat terbaru dari sesi lain, saya hanya menjalankan perintah itu dan tersedia untuk saya secara instan.
Elijah Lynn
ekspor tidak diperlukan.
Penebusan Terbatas
6

Lihat juga " menyimpan riwayat persisten di bash " untuk alternatif lain. Rigs prompt Anda untuk mengirim semua perintah yang pernah diketik ke terminal apa pun ke file "persistent history" (di samping apa yang biasanya dilakukan untuk reguler .history).

Eli Bendersky
sumber
1
Saya menyisipkan $$ untuk membuat baris. echo $$ $date_part "$command_part" >> ~/.persistent_historyIni mengawali entri dengan PID dari proses bash mereka, sehingga kami dapat mengurai banyak riwayat.
Evgeni Sergeev
Bisakah sejarah alternatif dibuat untuk bekerja dengan pencarian sejarah CTRL-R?
maks