我經常打開很多很多終端(現在,我在這個工作區上打開了七個終端),並且我經常搜索history
以grep
查找我最近剛剛編寫的命令,但我不想搜索終端然後滾動起來尋找它。
有時我的終端會在沒有 的情況下關閉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"
history -c
清除正在執行的會話的歷史記錄。這將減少歷史計數器的數量$HISTSIZE
。history -r
讀取內容$HISTFILE
並將其插入到目前正在執行的會話歷史記錄中。這將使歷史計數器增加 中的行數$HISTFILE
。
我認為這意味著命令幾乎立即可用(您有一個終端, write echo 1
,第二個終端echo 2
,第一個echo 3
,按向下箭頭兩次後,您應該可以echo 2
使用。您必須在給定終端中發出命令才能訪問具有的內容被寫了。
答案3
我有一個包含大約 100000 個條目的大型歷史文件,並且清除歷史列表並讀取整個歷史文件的變體(使用history -c
和history -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
這是預設行為。