bash: history -a tidak menulis kecuali HISTFILE sudah memiliki teks

1

Pernyataan masalah

Saya telah mengikuti banyak contoh untuk melakukan hal-hal kreatif dengan sejarah bash di sepanjang baris:

# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'

... tapi sepertinya bekerja sebentar-sebentar. Jika file riwayat sudah ada dengan riwayat sebelumnya maka semuanya baik-baik saja.

Info relevan lainnya

  • versi bash: 3.2.51, 4.1.2, dan 4.2.45
    • 4.2.x tampaknya tidak memiliki masalah ini, tetapi ini adalah instalasi non-default
  • OS: Linux & amp; Solaris
  • home dir sudah dipasang NFS

Langkah diagnostik

Saya menyingkirkan saya .bashrc & amp; atur .bash_profile untuk:

HISTFILE=$HOME/.bash_history.test

Saya kemudian akan memulai shell login (misalnya, ssh ke komputer lain) & amp; lakukan sesuatu seperti berikut:

~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
    1  cat .bash_history.test
    2  history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory

File riwayat tidak akan ditambahkan oleh history -a dalam keadaan berikut:

  • File belum ada
  • File kosong atau hanya berisi baris baru; bahkan spasi putih akan membuatnya bekerja

... Namun, ketika shell keluar tidak menciptakannya. Kemudian, history -a berfungsi seperti yang diharapkan ... kecuali kapan PROMPT_COMMAND="history -a; history -c; history -r". Ketika saya memiliki set itu, bahkan keluar dari shell tidak membuat file histori (kecuali saya berlari exec bash pertama).

Saya kemudian mencoba dengan instalasi bash (4.2.x) yang tidak standar dan masalahnya tidak nyata.

Brian Vandenberg
sumber

Jawaban:

1

Utas milis ini tampaknya menjelaskan masalah ini; mengutip dari pesan ke-2:

Kode saat ini di bashhist.c: maybe_append_history () (yang memiliki   ada setidaknya selama 15 tahun) tampaknya tidak menangani kasus di mana   jumlah baris riwayat di sesi saat ini sama dengan angka   entri daftar riwayat. Artinya, kode tidak akan menambahkan baris baru jika   tidak berpikir ada baris yang dibaca dari file histori ketika   cangkang dimulai. Itu sepertinya salah, dan saya sudah menempelkan tambalan itu   memperbaikinya. Namun, kode tersebut sudah ada dalam bentuk saat ini untuk itu   lama aku bertanya-tanya apakah ada alasan lain   saya t.

(Chet Ramey, mailing list GNU bash)

Selanjutnya, changelog untuk 4.2 memiliki teks berikut:

+                  8/13
+                  ----
+bashhist.c
+   - in maybe_append_history, change check for history_lines_this_session
+     so that we append the lines to the file if it's equal to the value
+     returned by where_history().  This means that without this change,
+     the history won't be appended if all the lines in the history list
+     were added in the current session since the last time the history
+     file was read or written.  Fixes bug reported by Bruce Korb
+     <[email protected]>

(git.savannah.gnu.org, bash git repo)

Jelas kita perlu menginstal versi bash yang lebih baru untuk menyelesaikan masalah ini.

Semoga ini membantu orang lain di jalan.

Brian Vandenberg
sumber