Bisakah file histori disatukan dalam bash?

35

Saya secara rutin menjalankan beberapa screensesi di desktop dan server Linux saya.

Masalah dengan ini adalah bahwa ketika saya grepmelalui sejarah perintah saya, saya menemukan saya mengeluarkan perintah di sesi yang berbeda, dan harus melepaskan dan melampirkan kembali untuk mendapatkan item sejarah itu.

Apakah mungkin untuk 'memaksa' sejarah yang diperbarui secara berbeda dari beberapa sesi untuk semua pergi ke sejarah pusat?

warren
sumber
Saya mengalami masalah serupa di mana saya tidak dapat melihat riwayat antara sesi terminal. Ternyata file ~ / .bash_history saya dimiliki oleh root dan tidak dapat ditulis. Mengubah pemilik / grup ke pengguna saya memperbaiki masalah: sudo chown <user>: <group> ~ / .bash_history
mateo

Jawaban:

41

Ada dua hal yang perlu Anda lakukan:

  1. Masukkan perintah shopt -s histappenddi .bashrc. Ini akan ditambahkan ke file histori alih-alih menimpa itu.
  2. Juga di Anda .bashrc, masukkan PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"dan file riwayat akan ditulis ulang dan dibaca kembali setiap kali bash menampilkan prompt.

EDIT: Terima kasih kepada e-t172 untuk history -ntriknya

innaM
sumber
6
Terima kasih untuk ini. Saya memperbaikinya lebih lanjut menggunakan PROMPT_COMMAND = "$ PROMPT_COMMAND; history -a; history -n". Dengan cara ini, perintah yang dikeluarkan di sesi lain segera muncul dalam riwayat sesi saat ini (yah, Anda harus menekan Enter terlebih dahulu untuk memperbarui riwayat).
Etienne Dechamps
8
Saya tidak PROMPT_COMMANDmendefinisikan sebelumnya, jadi saya harus menggunakan PROMPT_COMMAND="history -a; history -n"untuk menghindari kesalahan.
William Jackson
1
silakan lihat jawaban superuser.com/a/734410/250287 untuk riwayat yang benar perintah -a, -c, dan -r.
mt
Hanya peringatan kepada pendatang baru: setelah menggunakan penulisan ulang sejarah untuk sementara waktu, saya menyadari bahwa saya sering mengeluarkan perintah yang salah; ketika Anda melihat di baris sebelumnya beberapa perintah, Anda mengharapkan panah untuk mengulanginya, dan dengan konfigurasi ini tidak lagi selalu demikian.
Tiago
11

Tolong jangan gunakan history -a; history -n, itu tidak berfungsi seperti yang Anda harapkan dan akan meninggalkan Anda dengan banyak duplikat, perintah rusak dalam sejarah Anda. Solusi yang berfungsi secara umum seperti yang diharapkan adalah sebagai berikut:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Menggunakan baris baru alih-alih titik koma juga merupakan cara singkat untuk menangani masalah titik koma yang hilang / duplikat dengan PROMPT_COMMAND.

Adam Crane
sumber
sejarah -a, -c, dan kemudian -r benar ... ini harus menjadi jawaban yang diterima
mtd
1
Itu exporttidak perlu. Karena opsi shell interaktif seharusnya ditetapkan dari ~/.bashrcmana dipanggil dari setiap sub shell, maka pewarisan tidak diperlukan.
dolmen
Apakah ada alasan yang baik untuk tidak menggunakannya PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"saja?
Enam
Pemesanan itu akan membutuhkan seseorang untuk menyimpan nilai keluar terakhir sebelum menjalankan perintah histori, karena banyak perintah prompt bergantung atau menampilkannya.
Adam Crane
-1

PROMPT_COMMAND tidak didefinisikan secara default di beberapa distro. Sebagai contoh, ini didefinisikan dalam Arch, tetapi tidak dalam Debian.

Saya memiliki bashrc di Dropbox saya yang saya gunakan saat distro melompat, dan itu termasuk:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"
czaya
sumber
Solusi buruk untuk masalah pemrograman shell dasar. Cara yang benar:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen
Lebih baik:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen