問題陳述
我一直在關注大量利用 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 來解決這個問題。
希望這對其他人有幫助。