Saya secara konsisten memiliki lebih dari satu terminal terbuka. Di mana saja dari dua hingga sepuluh, melakukan berbagai bit dan bobs. Sekarang katakanlah saya me-restart dan membuka terminal lain. Beberapa mengingat hal-hal tertentu, beberapa lupa.
Saya ingin sejarah yang:
- Ingat semuanya dari setiap terminal
- Dapat diakses secara instan dari setiap terminal (mis. Jika saya
ls
dalam satu terminal , pindah ke terminal lain yang sudah berjalan dan kemudian tekan naik,ls
muncul) - Tidak lupa perintah jika ada spasi di depan perintah.
Adakah yang bisa saya lakukan untuk membuat bash bekerja lebih seperti itu?
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
. Kerang yang ada akan menambahkan setiap perintah ke file riwayat untuk dilihat kerang baru, tetapi hanya menampilkan sejarahnya sendiri.Jawaban:
Tambahkan berikut ini ke ~ / .bashrc
sumber
history -a
(...) tidak memicu menghapus duplikat menurut ini jawaban atas pertanyaan sejarah Bash: “ignoredups” dan “erasedups” pengaturan konflik dengan sejarah umum di sesi . Jawaban ini juga memberikan urutanhistory -<option>
perintah yang berfungsi denganHISTCONTROL=ignoredups:erasedups
pengaturan.export
ituHISTCONTROL
danPROMPT_COMMAND
variabel: Anda mendefinisikan mereka dalam.bashrc
sehingga mereka akan ditentukan di setiap shell (bahkan dalam yang non-interaktif, yang juga boros).Jadi, ini semua yang berhubungan dengan sejarah saya
.bashrc
:Diuji dengan bash 3.2.17 pada Mac OS X 10.5, bash 4.1.7 pada 10.6.
sumber
sleep 9999
, dan (tanpa menunggu waktu tidur selesai) di jendela shell B, saya ingin dapat melihatsleep 9999
di bash history.href
yang menyegarkan sejarah terminal saya saat ini secara instan dan membersihkan file histori dalam proses. Setiap kali saya membuka terminal baru, pembersihan / sinkronisasi itu dijalankan di file bashrc saya sehingga terminal baru memiliki sejarah terbaru. Saya menggunakan itu bersama denganhistory -a
export
variabel: Anda mendefinisikan mereka.bashrc
sehingga mereka akan didefinisikan di setiap shell (bahkan yang non-interaktif, yang juga boros)Ini adalah upaya saya untuk berbagi riwayat sesi Bash. Ini akan memungkinkan pembagian riwayat antara sesi bash dengan cara agar penghitung sejarah tidak ikut campur dan ekspansi riwayat seperti itu
!number
akan berfungsi (dengan beberapa kendala).Menggunakan Bash versi 4.1.5 di bawah Ubuntu 10.04 LTS (Lucid Lynx).
Penjelasan:
Tambahkan baris yang baru saja dimasukkan ke
$HISTFILE
(standarnya adalah.bash_history
). Ini akan menyebabkan$HISTFILE
pertumbuhan satu baris.Mengatur variabel khusus
$HISTFILESIZE
ke beberapa nilai akan menyebabkan Bash memotong$HISTFILE
tidak lebih dari$HISTFILESIZE
garis dengan menghapus entri terlama.Kosongkan riwayat sesi lari. Ini akan mengurangi penghitung riwayat dengan jumlah
$HISTSIZE
.Baca konten
$HISTFILE
dan masukkan ke riwayat sesi berjalan saat ini. ini akan meningkatkan penghitung sejarah dengan jumlah baris dalam$HISTFILE
. Perhatikan bahwa jumlah baris$HISTFILE
belum tentu$HISTFILESIZE
.The
history()
Fungsi menimpa sejarah builtin memastikan bahwa sejarah disinkronisasikan sebelum ditampilkan. Ini diperlukan untuk ekspansi sejarah dengan angka (lebih lanjut tentang ini nanti).Penjelasan lebih lanjut:
Langkah 1 memastikan bahwa perintah dari sesi berjalan saat ini akan ditulis ke file riwayat global.
Langkah 4 memastikan bahwa perintah dari sesi lain bisa dibaca ke riwayat sesi saat ini.
Karena langkah 4 akan meningkatkan penghitung sejarah, kita perlu mengurangi penghitung dengan beberapa cara. Ini dilakukan pada langkah 3.
Di langkah 3 penghitung sejarah dikurangi oleh
$HISTSIZE
. Pada langkah 4 penghitung sejarah dinaikkan oleh jumlah baris di$HISTFILE
. Pada langkah 2 kami memastikan bahwa jumlah baris$HISTFILE
persis$HISTSIZE
(ini artinya$HISTFILESIZE
harus sama dengan$HISTSIZE
).Tentang kendala ekspansi sejarah:
Saat menggunakan ekspansi riwayat dengan angka, Anda harus selalu mencari nomornya segera sebelum menggunakannya. Itu berarti tidak ada tampilan bash prompt antara mencari nomor dan menggunakannya. Itu biasanya berarti no enter dan no ctrl + c.
Secara umum, setelah Anda memiliki lebih dari satu sesi Bash, tidak ada jaminan apa pun bahwa ekspansi riwayat dengan angka akan mempertahankan nilainya di antara dua tampilan Bash prompt. Karena ketika
PROMPT_COMMAND
dijalankan, riwayat dari semua sesi Bash lainnya terintegrasi dalam riwayat sesi saat ini. Jika ada sesi bash lain yang memiliki perintah baru, maka nomor riwayat sesi saat ini akan berbeda.Saya menemukan batasan ini masuk akal. Lagi pula saya harus mencari nomornya karena saya tidak dapat mengingat angka sejarah yang berubah-ubah.
Biasanya saya menggunakan ekspansi sejarah dengan nomor seperti ini
Saya sarankan menggunakan opsi Bash berikut.
Bug aneh:
Menjalankan perintah histori yang disalurkan ke apa saja akan menghasilkan perintah yang terdaftar dalam histori dua kali. Sebagai contoh:
Semua akan terdaftar dalam sejarah dua kali. Saya tidak tahu kenapa.
Gagasan untuk peningkatan:
Ubah fungsi
_bash_history_sync()
agar tidak dieksekusi setiap saat. Sebagai contoh, ia tidak boleh dijalankan setelahCTRL+C
diminta. Saya sering menggunakanCTRL+C
untuk membuang baris perintah yang panjang ketika saya memutuskan bahwa saya tidak ingin mengeksekusi baris itu. Terkadang saya harus menggunakanCTRL+C
untuk menghentikan skrip penyelesaian Bash.Perintah dari sesi saat ini harus selalu menjadi yang terbaru dalam sejarah sesi saat ini. Ini juga akan memiliki efek samping bahwa nomor sejarah yang diberikan menyimpan nilainya untuk entri riwayat dari sesi ini.
sumber
history -n
karena itu mengacaukan counter sejarah. Juga, saya menemukanhistory -n
terlalu tidak dapat diandalkan.history -a
, tanpa-c
dan-r
, lebih baik kegunaan-bijaksana (meskipun bukan itu pertanyaannya). Ini berarti perintah yang Anda jalankan tersedia secara instan di shell baru bahkan sebelum keluar dari shell saat ini, tetapi tidak di shell yang berjalan bersamaan. Dengan cara ini Arrow-Up masih selalu memilih perintah yang dijalankan terakhir dari sesi saat ini , yang menurut saya jauh lebih membingungkan.Saya tidak mengetahui cara apa pun menggunakan
bash
. Tapi itu salah satu fitur paling populerzsh
.Secara pribadi saya lebih suka
zsh
lebihbash
jadi saya sarankan mencoba.Inilah bagian dari saya
.zshrc
yang berkaitan dengan sejarah:sumber
Untuk melakukan ini, Anda harus menambahkan dua baris ke
~/.bashrc
:Dari
man bash
:sumber
Anda dapat mengedit BASH prompt Anda untuk menjalankan "history -a" dan "history -r" yang disarankan Muerr:
(Jika Anda mengacaukan sesuatu, yang hampir dijamin)
(perhatikan bahwa ini adalah tick-back; mereka akan menjalankan history -a dan history -r pada setiap prompt. Karena mereka tidak menampilkan teks apa pun, prompt Anda tidak akan berubah.
Setelah Anda mengatur variabel PS1 seperti yang Anda inginkan, atur secara permanen di file ~ / .bashrc Anda.
Jika Anda ingin kembali ke permintaan awal saat pengujian, lakukan:
Saya telah melakukan pengujian dasar pada ini untuk memastikan bahwa itu berfungsi, tetapi tidak dapat berbicara dengan efek samping dari menjalankan
history -a;history -r
pada setiap prompt.sumber
Jika Anda memerlukan solusi sinkronisasi sinkronisasi bash atau zsh yang juga menyelesaikan masalah di bawah ini, maka lihat di http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.html
Masalahnya adalah sebagai berikut: Saya memiliki dua jendela shell A dan B. Di jendela shell A, saya berlari
sleep 9999
, dan (tanpa menunggu waktu tidur selesai) di jendela shell B, saya ingin dapat melihatsleep 9999
di bash history.Alasan mengapa sebagian besar solusi lain di sini tidak akan menyelesaikan masalah ini adalah karena mereka menulis perubahan histori mereka ke file histori menggunakan
PROMPT_COMMAND
atauPS1
, keduanya mengeksekusi terlalu terlambat, hanya setelahsleep 9999
perintah selesai.sumber
Anda dapat menggunakan
history -a
untuk menambahkan histori sesi saat ini ke histfile, kemudian gunakanhistory -r
di terminal lain untuk membaca histfile.sumber
Benar, Jadi akhirnya ini mengganggu saya untuk menemukan solusi yang layak:
Apa yang dilakukan adalah semacam penggabungan dari apa yang dikatakan di utas ini, kecuali bahwa saya tidak mengerti mengapa Anda memuat ulang sejarah global setelah setiap perintah. Saya sangat jarang peduli dengan apa yang terjadi di terminal lain, tetapi saya selalu menjalankan serangkaian perintah, misalnya di satu terminal:
(Contoh sederhana)
Dan di tempat lain:
Tidak mungkin saya ingin perintah itu dibagikan
sumber
Inilah alternatif yang saya gunakan. Ini rumit tapi itu mengatasi masalah yang @axel_c sebutkan di mana kadang-kadang Anda mungkin ingin memiliki instance history terpisah di setiap terminal (satu untuk make, satu untuk pemantauan, satu untuk vim, dll).
Saya menyimpan file riwayat tambahan terpisah yang terus saya perbarui. Saya memetakan yang berikut ini ke hotkey:
Ini menambahkan semua riwayat dari terminal saat ini ke file yang disebut master_history.txt di direktori home Anda.
Saya juga memiliki hotkey terpisah untuk mencari melalui file master history:
Saya menggunakan kucing | grep karena ia meninggalkan kursor di akhir untuk memasukkan regex saya. Cara yang kurang jelek untuk melakukan ini adalah dengan menambahkan beberapa skrip ke jalur Anda untuk menyelesaikan tugas-tugas ini, tetapi hotkey berfungsi untuk tujuan saya. Saya juga secara berkala akan menarik riwayat dari host lain yang telah saya kerjakan dan menambahkan riwayat itu ke file master_history.txt saya.
Selalu menyenangkan untuk dapat dengan cepat mencari dan menemukan regex rumit yang Anda gunakan atau perl satu-liner yang Anda buat 7 bulan lalu.
sumber
Saya dapat menawarkan perbaikan untuk yang terakhir: pastikan variabel env HISTCONTROL tidak menentukan "ignorespace" (atau "ignoreboth").
Tapi saya merasakan sakit Anda dengan beberapa sesi bersamaan. Ini tidak ditangani dengan baik di bash.
sumber
Inilah peningkatan saya untuk jawaban @ lesmana . Perbedaan utama adalah bahwa windows bersamaan tidak membagikan sejarah. Ini berarti Anda dapat tetap bekerja di windows Anda, tanpa konteks dari jendela lain yang dimuat ke windows Anda saat ini.
Jika Anda secara eksplisit mengetik 'histori', ATAU jika Anda membuka jendela baru maka Anda mendapatkan histori dari semua jendela sebelumnya.
Juga, saya menggunakan strategi ini untuk mengarsipkan setiap perintah yang pernah diketik di mesin saya.
sumber
Saya memilih untuk memasukkan histori dalam file-per-tty, karena banyak orang dapat bekerja di server yang sama - memisahkan setiap perintah sesi membuatnya lebih mudah untuk diaudit.
Sejarah sekarang terlihat seperti:
Dengan file yang terlihat seperti:
sumber
Di sini saya akan menunjukkan satu masalah dengan
dan
Jika Anda menjalankan source ~ / .bashrc, $ PROMPT_COMMAND akan menjadi seperti
dan
Pengulangan ini terjadi setiap kali Anda menjalankan 'source ~ / .bashrc'. Anda dapat memeriksa PROMPT_COMMAND setelah setiap kali Anda menjalankan 'source ~ / .bashrc' dengan menjalankan 'echo $ PROMPT_COMMAND'.
Anda bisa melihat beberapa perintah tampaknya rusak: "history -n history -a". Tapi kabar baiknya adalah masih berfungsi, karena bagian lain masih membentuk urutan perintah yang valid (Hanya melibatkan beberapa biaya tambahan karena menjalankan beberapa perintah berulang-ulang. Dan tidak begitu bersih.)
Secara pribadi saya menggunakan versi sederhana berikut:
yang memiliki sebagian besar fungsi sementara tidak ada masalah seperti yang disebutkan di atas.
Hal lain yang perlu dikemukakan adalah: sebenarnya tidak ada keajaiban . PROMPT_COMMAND hanyalah variabel lingkungan bash biasa. Perintah di dalamnya dieksekusi sebelum Anda mendapatkan bash prompt (tanda $). Misalnya, PROMPT_COMMAND Anda adalah "echo 123", dan Anda menjalankan "ls" di terminal Anda. Efeknya seperti menjalankan "ls; echo 123".
output (Sama seperti menjalankan 'PROMPT_COMMAND = "echo 123"; $ PROMPT_COMMAND'):
Jalankan yang berikut ini:
keluaran:
"history -a" digunakan untuk menulis perintah histori dalam memori ke ~ / .bash_history
"history -c" digunakan untuk menghapus perintah history dalam memori
"history -r" digunakan untuk membaca perintah history dari ~ / .bash_history ke memori
Lihat penjelasan perintah sejarah di sini: http://ss64.com/bash/history.html
PS: Seperti yang ditunjukkan oleh pengguna lain, ekspor tidak perlu. Lihat: menggunakan ekspor di .bashrc
sumber
Saya telah menulis skrip untuk mengatur file riwayat per sesi atau tugas berdasarkan dari berikut ini.
Tidak perlu menyimpan setiap perintah sejarah tetapi menyimpan yang saya sayangi dan lebih mudah untuk mengambilnya kemudian melalui setiap perintah. Versi saya juga mencantumkan semua file riwayat dan menyediakan kemampuan untuk mencari semuanya.
Sumber lengkap: https://github.com/simotek/scripts-config/blob/master/hiset.sh
sumber
Inilah solusi yang tidak mencampuradukkan sejarah dari sesi individual!
Pada dasarnya kita harus menyimpan sejarah setiap sesi secara terpisah dan membuatnya kembali pada setiap prompt. Ya, ia menggunakan lebih banyak sumber daya, tetapi tidak selambat kedengarannya - penundaan mulai terlihat hanya jika Anda memiliki lebih dari 100.000 entri riwayat.
Inilah logika intinya:
Lihat inti ini untuk solusi lengkap, termasuk beberapa pengamanan dan optimalisasi kinerja.
sumber
Ini berfungsi untuk ZSH
sumber
Saya sudah lama menginginkan ini, terutama kemampuan untuk mengambil perintah di mana dijalankan untuk mengeksekusi kembali dalam proyek baru (atau menemukan direktori dengan perintah). Jadi saya menyatukan alat ini , yang menggabungkan solusi sebelumnya untuk menyimpan sejarah CLI global dengan alat grepping interaktif yang disebut percol (dipetakan ke C ^ R). Masih licin pada mesin pertama yang saya mulai menggunakannya, sekarang dengan riwayat CLI> 2 tahun.
Itu tidak mengacaukan sejarah CLI lokal sejauh menyangkut tombol panah, tetapi memungkinkan Anda mengakses sejarah global dengan cukup mudah (yang Anda juga dapat memetakan ke sesuatu selain C ^ R)
sumber
Karena saya lebih suka riwayat tak terbatas yang disimpan dalam file khusus. Saya membuat konfigurasi ini berdasarkan https://stackoverflow.com/a/19533853/4632019 :
sumber
Berikut ini cuplikan dari .bashrc saya dan penjelasan singkat di mana pun dibutuhkan:
HISTFILESIZE dan HISTSIZE adalah preferensi pribadi dan Anda dapat mengubahnya sesuai selera Anda.
sumber