bash:history -a 除非 HISTFILE 已經有文本,否則不會寫入

bash:history -a 除非 HISTFILE 已經有文本,否則不會寫入

問題陳述

我一直在關注大量利用 bash 歷史進行創意工作的例子,大致如下:

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

……但它似乎間歇性地工作。如果歷史文件已經存在並具有以前的歷史記錄,那麼一切都很好。

其他相關資訊

  • bash 版本:3.2.51、4.1.2 和 4.2.45
    • 4.2.x 似乎沒有這個問題,但它是非預設安裝
  • 作業系統:Linux 和 Solaris
  • 主目錄是 NFS 安裝的

診斷步驟

我擺脫了我的.bashrc並將我的設定.bash_profile為:

HISTFILE=$HOME/.bash_history.test

然後我將啟動一個登入 shell(例如,ssh 到另一台機器)並執行以下操作:

~ 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

history -a在以下情況下,歷史文件將不會被追加:

  • 該文件尚不存在
  • 文件為空或僅包含換行符;即使是空格也能正常運作

……但是,當 shell 退出時創造它。此後,history -a按預期工作...除非PROMPT_COMMAND="history -a; history -c; history -r"。當我完成該設定後,即使退出外殼也不會建立歷史檔案(除非我exec bash先運行)。

然後我嘗試使用非標準安裝的 bash (4.2.x),但問題並未出現。

答案1

此郵件清單主題似乎可以解釋這些問題;引用第二條訊息:

bashist.c:maybe_append_history() 中的目前程式碼(已存在至少 15 年)似乎無法處理目前會話中的歷史行數等於歷史清單條目數的情況。也就是說,如果 shell 啟動時程式碼認為沒有從歷史檔案中讀取任何行,則程式碼不會追加新行。這似乎是錯誤的,我已經附加了一個修復它的補丁。然而,該代碼以其當前形式存在了很長時間,以至於我想知道是否還有其他原因。

(Chet Ramey,GNU bash 郵件列表)

此外,變更日誌4.2 的文字如下:

+                  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)

顯然我們需要安裝更新版本的 bash 來解決這個問題。

希望這對其他人有幫助。

相關內容