為什麼預設 bash 似乎沒有我歷史上使用過的一些命令,但有其他命令?

為什麼預設 bash 似乎沒有我歷史上使用過的一些命令,但有其他命令?

在 Mac 上,塞拉。

我沒有HIST看到相關的設定:

~ @ Magni (jcollum) 
$ env|grep HIST

~ @ Magni (jcollum) 
$ cat ~/.bash_profile | grep HIST

~ @ Magni (jcollum) 

但在我的歷史記錄中,我昨天所做的一些事情在重新啟動後就不再存在了。真的很懷疑我每次執行命令時都會在命令前添加空格。

我知道這裡有帖子告訴我如何修復它,但我想知道為什麼事情是這樣發生的。

例如,當我 grep 查找curl我昨天運行的 a 時,什麼都沒有:

~ @ Magni (jcollum) 
$ history | grep curl 
166  curl -X POST -d [email protected] -d password=********** http://localhost:3000/login
503  hg curl 
519  history | grep curl 

400 命令前?我知道curl過去一周我已經使用了十幾次,但是(而且我本週使用 bash 的次數還不足以運行數百個命令)。

基本上我只是感到困惑,不知道為什麼它缺少我所做的這麼多。歷史是否有可能僅從一個 bash 實例記錄?

答案1

歷史是否有可能僅從一個 bash 實例記錄?

這就是正在發生的事情。歷史記錄在 bash 中的工作方式是:

  • 當 bash 啟動時,它會從歷史檔案載入已儲存的歷史記錄。
  • 每次執行命令時,它都會添加到 bash 記憶體中的歷史記錄中。
  • 當bash退出時,它會將累積的歷史記錄保存到歷史文件中。

現在假設您啟動了兩個 bash 實例。兩者在啟動時都會載入歷史文件。兩者都將它們運行的命令添加到自己的歷史記錄中。當一個實例退出時,它將舊的歷史記錄以及它自己的命令保存到歷史文件中。當第二個實例退出時,它保存了舊的歷史記錄加上它是自己的命令寫入歷史文件 - 在執行此操作時,它會擦除第一個退出實例的歷史記錄。

Bash 的歷史記錄保存機制過於簡單。您的歷史記錄受其他所有正在運行的實例的支配—最後退出的實例會擦除其他實例的歷史記錄。解決方案包括將新的歷史記錄附加到歷史文件中,而不是用整個記憶體中的歷史記錄覆蓋歷史文件,或在執行行後立即將行附加到歷史文件中。看在多個終端機視窗中保留 bash 歷史記錄在多個終端機視窗中保留 bash 歷史記錄了解實現此變體和其他變體的一些方法。

最簡單的解決方案是運行 zsh,它預設以合理的方式保存歷史記錄。我建議這樣做,特別是因為您運行的是 macOS,它停留在舊版本的 bash 上,因為 Apple 不喜歡 2009 年以來發布的版本的許可證。

相關內容