bashの履歴はどこに保存されますか?


95

を実行するhistoryと、最新の実行コマンドが表示されます。

しかし、私がやったtail -f $HISTFILE場合tail -f ~/.bash_history、それらはリストされません。

ファイルはロックされますか、一時的な場所などがありますか?

回答:


117

Bashは、実行中にコマンドのリストを内部的にメモリに保持します。それらは.bash_history終了時に書き込まれます

対話型シェルが終了すると、最後の$ HISTSIZE行が履歴リストから$ HISTFILEで指定されたファイルにコピーされます

コマンド履歴を強制的に書き出す場合は、history -a次のコマンドを使用できます。

新しい履歴行(現在のBashセッションの開始以降に入力された履歴行)を履歴ファイルに追加します。

-wオプションもあります:

現在の履歴を履歴ファイルに書き出します。

履歴の使用方法に応じて、より適している場合があります。

それらが常にすぐに書き込まれるようにしたい場合は、そのコマンドをPROMPT_COMMAND変数に入れることができます。

export PROMPT_COMMAND='history -a'

サイドノート:.bash_historyファイルが誤ってrootによって所有された場合、動作は停止します。その場合、所有権を確認し、sudo必要に応じて所有権を修正するために使用します。
トレック

13

(答えではありませんが、コメントを追加できません)

.bash_history特定のコマンド(たとえば、クリアテキストのパスワードを含む)を削除するだけなのでチェックしている場合は、でメモリ内のエントリを直接削除できますhistory -d <entry_id>

たとえば、次のような出力を想定します。

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

export回線を削除する場合は、次の方法で簡単に実行できます。

history -d 928

11

bashは作業メモリに保持します。bashは、bashの終了時または各コマンドの後に保存し、bashの開始時または要求時にロードするように構成できます。

各コマンドの後に保存するように構成する場合は、同時に複数のbashを実行することの意味を考慮してください。(コマンドラインはインターリーブされます)


2
あなたの答えの始まりは、あたかも履歴がbashと呼ばれるファイル、または実行可能ファイルに保存されているかのようにbash聞こえます。「それはbashメモリに保存されます...」と書きます
アントン14

それは確かに良いです
アントン14

5

セッションがアクティブな間、コマンドはメモリ(RAM)に保存されます。シェルを閉じるとすぐに、.bash_historyシャットダウンする前にコマンドリストが書き込まれます。

したがって、現在のセッションの履歴はに表示されません.bash_history


4
履歴ファイルはbash終了時に更新されますが、これは再起動を意味しません(特に、必要に応じて端末を開いたり閉じたりできるグラフィカル環境では)。
ジョンWHスミス14

4

実行中、履歴は次の場合にのみメモリに保存されます(デフォルト)。

  • set -o history(an Hin echo "$-")が設定されます。
  • HISTSIZEはそうはありません0
  • HISTIGNOREは*(または他の非常に制限的なパターン)ではありません。

上記のいずれかが失敗した場合、履歴はメモリに保存されず、その結果、ディスクに履歴を書き込むことも書き込むこともできません。

メモリ内の履歴は、次の場合にディスクに書き込まれます。

  • HISTFILESIZEは0ではなく
  • HISTFILEは設定解除されていません。

ただし、シェルが終了したとき、またはコマンドhistory -a(追加)またはhistory -w(書き込み)が実行された場合のみです。

ディスクへの即時書き込みをトリガーするには、変数を使用できます。

 PROMPT_COMMAND='history -a'

これはappendnew履歴ファイルへの履歴行になります。これらは、現在のbashセッションの開始以降に入力された履歴行ですが、まだ履歴ファイルに追加されていません。

または:

 PROMPT_COMMAND='history -w'

するために、上書きメモリからのリストとHISTFILEで歴史を。

そのため、メモリ内の履歴からコマンドを削除できます。

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

最後のコマンドでディスクに書き込みます:

 history -w    # with `shopt -u histappend` unset

これをcronジョブに入れることで何か問題はありますか?私は...はるかに少ないのユーザー名とユーザーの多くは、特定のサーバにログオンすると、まだ歴史はかなり小さく、これは古いサーバーであることを疑うが、おそらくいくつかのセッションが閉じられていないさん
oneindelijk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.