デフォルトの bash には、これまで使用したコマンドの一部が存在しないのに、他のコマンドは存在するのはなぜでしょうか?

デフォルトの bash には、これまで使用したコマンドの一部が存在しないのに、他のコマンドは存在するのはなぜでしょうか?

Macでは、Sierra。

関連する設定は表示されませHISTん:

~ @ Magni (jcollum) 
$ env|grep HIST

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

~ @ Magni (jcollum) 

しかし、昨日実行した内容が、再起動後には履歴に残っていません。毎回コマンドの前にスペースを入れたかどうか、本当に疑わしいです。

ここに修正方法を教えてくれる投稿があることは知っていますが、知りたいですなぜそれはこのように起こります。

curlたとえば、昨日実行したを grep すると、何も表示されません。

~ @ 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 

curl400 コマンド前ですか?過去 1 週間に 12 回ほど使用したことはわかっていますが (また、今週は何百ものコマンドを実行するほど bash を使用していません)。

基本的に私は困惑しており、自分が行った操作の多くがなぜ失われているのか分かりません。履歴が 1 つの bash インスタンスからのみ記録されている可能性はありますか?

答え1

履歴が 1 つの bash インスタンスからのみ記録されている可能性はありますか?

実際は、このような状況です。bash での履歴の動作は、わざわざ変更しない限り、次のようになります。

  • bash が起動すると、保存された履歴が履歴ファイルから読み込まれます。
  • コマンドが実行されるたびに、bash のメモリ内の履歴に追加されます。
  • bash が終了すると、蓄積された履歴が履歴ファイルに保存されます。

ここで、bash のインスタンスを 2 つ起動したとします。どちらも起動時に履歴ファイルを読み込みます。どちらも実行したコマンドを自分の履歴に追加します。1 つのインスタンスが終了すると、古い履歴と自分のコマンドが履歴ファイルに保存されます。2 番目のインスタンスが終了すると、古い履歴とその独自のコマンドを履歴ファイルに書き込みます。これにより、終了した最初のインスタンスの履歴が消去されます。

Bash の履歴保存メカニズムは単純すぎる。履歴行は他の実行中のインスタンスの影響を受け、最後に終了したインスタンスが他のインスタンスの履歴を消去する。解決策としては、メモリ内の履歴全体を履歴ファイルに上書きするのではなく、新しい履歴を履歴ファイルに追加するか、実行されたらすぐに行を履歴ファイルに追加する。複数のターミナルウィンドウでbashの履歴を保存するそして複数のターミナルウィンドウでbashの履歴を保存するこれと他のバリエーションを実装するいくつかの方法について。

最も簡単な解決策は、デフォルトで正常な方法で履歴を保存する zsh を実行することです。特に、Apple が 2009 年以降にリリースされたバージョンのライセンスを好まないため、古いバージョンの bash で停止している macOS を実行している場合は、これをお勧めします。

関連情報