web-dev-qa-db-ja.com

bash履歴の半分が欠落しています

先日、私はAU Q&Aを読んでいて、bashコマンドを使用しました:

inxi -????

問題は今日????を構成するキャラクターを覚えていないことです。コマンドとパラメーターをドキュメントスプレッドシートに入れたい。この回答に基づいて( ターミナルで履歴をリコールする方法 )このコマンドを使用しました:

$ cat .bash_history | grep inxi
inxi -b
Sudo apt install inxi
inxi -b

しかし、私が望むコマンドは、歴史がずっと前になってもありません。古い履歴以来、ターミナルでinxiコマンドを何度も使用しましたが、どれも表示されません。

私も試しました Ctrl+R+inxi 運もなく。常に複数のターミナルウィンドウを開くのは、履歴が特定のウィンドウに関連付けられているからですか?

grep bash履歴ファイルに別の方法はありますか?

ターミナルコマンドの前に Space Bar 歴史から抑圧されるように。

6

マシンにアクセスしないと何が起こったのかわかりませんが、ここでは、履歴システムがどのように機能するかについて簡単に説明します。

開いている各ターミナルには、独自の履歴バッファがあります。これらのバッファは、端末が閉じられたときに$HISTFILEに追加されます(バッファがいっぱいになったときもありますが、その頻度はわかりません)。履歴でコマンドを検索する方法は、単に実行することです:

history | grep command

ただし、コマンドが別のシェルで実行された場合、現在のシェルの履歴には表示されません。これを修正するには、開いているシェルをすべて閉じ、新しいターミナルウィンドウを開いて履歴を再度検索します。

それでも解決しない場合は、$HISTFILEに保存されているコマンドのしきい値を超えている可能性があります。 $HISTFILEの動作はさまざまな環境変数によって制御されます(完全なリストについてはman bashを参照してください)が、関連するものは次のとおりです。

   HISTSIZE
          The  number  of commands to remember in the command history (see HISTORY below).  If the value is 0, commands are not saved in the history list.  Numeric values less than
          zero result in every command being saved on the history list (there is no limit).  The Shell sets the default value to 500 after reading any startup files.

   HISTFILESIZE
          The maximum number of lines contained in the history file.  When this variable is assigned a value, the history file is truncated, if necessary, to contain no  more  than
          that number of lines by removing the oldest entries.  The history file is also truncated to this size after writing it when a Shell exits.  If the value is 0, the history
          file is truncated to zero size.  Non-numeric values and numeric values less than zero inhibit truncation.  The Shell sets the default value to the value of HISTSIZE after
          reading any startup files.

これらの値を高く設定するほど、$HISTFILEに保持するコマンドが増えます。たとえば、私は使用します:

HISTSIZE=999999
HISTFILESIZE=999999

あるシェルから別のシェルに履歴をインポートする場合は、historyコマンドを使用できます。

$ help history | grep -E -- '-a|-r'
      -a    append history lines from this session to the history file
      -r    read the history file and append the contents to the history

したがって、history -aを実行して1つの端末から履歴を書き込み、次にhistory -wを実行して別の端末から履歴を読み取ります。これで、historyを実行すると、両方のシェルの履歴が表示されます。

最後に、これらの行を~/.bashrcに追加することで、すべての端末に同じ履歴を共有させることができます。

## history -a causes the last command to be written to the
## history file automatically and history -r imports the history
export Prompt_COMMAND='history -a;history -r'

これを追加することもお勧めします。

## Make Bash append rather than overwrite the history on disk:
shopt -s histappend
6
terdon

あなたのコマンドは私のために働いた...

$ cat .bash_history | grep inxi
inxi -b
Sudo apt install inxi
inxi -b
inxi -Fxz -c 0 > inxi_list.txt
inxi -Fxz
inxi -Fxz
Sudo inxi -Fxz

また、定期的に履歴をファイルにコピーして保存します。

history > history_$(date '+%Y-%m-%d_%H:%M:%S')_$(hostname).txt
2
oldfred