是否可以立即寫入 .bash_history?

是否可以立即寫入 .bash_history?

我經常打開很多很多終端(現在,我在這個工作區上打開了七個終端),並且我經常搜索historygrep查找我最近剛剛編寫的命令,但我不想搜索終端然後滾動起來尋找它。

有時我的終端會在沒有 的情況下關閉exit,並且我在其中寫入的所有內容都會丟失。有時,我需要一些我在被殺死的終端中寫的東西。

有沒有辦法讓每個終端.bash_history立即寫入?或至少每分鐘一次,或類似的東西?

答案1

一個簡單的解決方案詳述於即時更新 Bash 歷史記錄

它說將這些命令放入 .bashrc 配置中:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

第一個命令將歷史檔案模式變更為追加,第二個命令將命令配置history -a為在每個 shell 提示字元下執行。此-a選項使history立即將目前/新行寫入歷史文件。

man bash:

如果啟用了 histappend shell 選項(請參閱下方的 SHELL BUILTIN COMMANDS 下的 shopt 說明),則這些行將追加到歷史檔案中,否則歷史檔案將被覆寫。

與 Zsh 相關:

答案2

嘗試將其放入您的.bashrc

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

信用在這裡:https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -c清除正在執行的會話的歷史記錄。這將減少歷史計數器的數量$HISTSIZEhistory -r讀取內容$HISTFILE並將其插入到目前正在執行的會話歷史記錄中。這將使歷史計數器增加 中的行數$HISTFILE

我認為這意味著命令幾乎立即可用(您有一個終端, write echo 1,第二個終端echo 2,第一個echo 3,按向下箭頭兩次後,您應該可以echo 2使用。您必須在給定終端中發出命令才能訪問具有的內容被寫了。

答案3

我有一個包含大約 100000 個條目的大型歷史文件,並且清除歷史列表並讀取整個歷史文件的變體(使用history -chistory -r)在顯示提示之前引入了明顯的延遲(可能是 0.2 秒)。使用history -n這樣只從歷史文件讀取新行會更快:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND不必導出,因為它是 shell 變數。

答案4

所有其他答案的註釋(基本上是相同的事情):

設定PROMPT_COMMAND="history -a;$PROMPT_COMMAND".bashrc(或朋友)就足夠了。

history -a此外,只要您想要「快照」目前會話中的歷史記錄,您就可以手動執行。

shopt -s histappend不需要該命令,因為history -a總是向檔案追加新行並且從不覆蓋它。此外,至少從 Bash 4 開始,histappend這是預設行為。

相關內容