web-dev-qa-db-ja.com

zshの無制限の履歴

zshでは、無制限の履歴を保持したいと考えています。 HISTSIZE=、これはbashで機能します。古い履歴をインポートします

mv old_history .history

かなり大きい

wc -l .history
43562 .history

ここでzshを閉じて再起動すると、

wc -l .history
32234 .history

zshに無制限の履歴はありませんか?

53
pfnuesel

マシンの限界と可能性があります。

HISTFILE="$HOME/.zsh_history"
HISTSIZE=10000000
SAVEHIST=10000000
setopt BANG_HIST                 # Treat the '!' character specially during expansion.
setopt EXTENDED_HISTORY          # Write the history file in the ":start:elapsed;command" format.
setopt INC_APPEND_HISTORY        # Write to the history file immediately, not when the Shell exits.
setopt SHARE_HISTORY             # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST    # Expire duplicate entries first when trimming history.
setopt HIST_IGNORE_DUPS          # Don't record an entry that was just recorded again.
setopt HIST_IGNORE_ALL_DUPS      # Delete old recorded entry if new entry is a duplicate.
setopt HIST_FIND_NO_DUPS         # Do not display a line previously found.
setopt HIST_IGNORE_SPACE         # Don't record an entry starting with a space.
setopt HIST_SAVE_NO_DUPS         # Don't write duplicate entries in the history file.
setopt HIST_REDUCE_BLANKS        # Remove superfluous blanks before recording entry.
setopt HIST_VERIFY               # Don't execute immediately upon history expansion.
setopt HIST_BEEP                 # Beep when accessing nonexistent history.

ZSHメーリングリスト から:

どのくらいのメモリを持っているか、どれだけのメモリを履歴で占有できるようにするか(常にメモリに完全に読み込まれていることを確認してください)、それに応じて行動する必要があります。制限を削除しても、利用可能なリソースによって常に制限されている一方で、制限はないという考えが残るため、賢明ではありません。

または、リソースの枯渇で問題が発生するとは思わない場合は、HISTSIZEをlimits.hからLONG_MAXに設定するだけです。これは、HISTSIZEに設定できる最大数です。

これはGentooソリューションを説明しています:

export HISTSIZE=2000
export HISTFILE="$HOME/.history"

次のコマンドがないと、履歴は保存されません。

export SAVEHIST=$HISTSIZE

履歴が重複したエントリ(単一のシェルセッション中に何度も入力されたls -lなど)を記録しないようにするには、hist_ignore_all_dupsオプションを設定します。

setopt hist_ignore_all_dups

特定のエントリの前に少なくとも1つのスペースを付けることで、特定のエントリが履歴に記録されないようにするための便利なトリック。

setopt hist_ignore_space
60
aurelien

HISTSIZESAVEHIST の両方を設定する必要があります。これらは、メモリに保存する履歴の行数と履歴ファイルに保存する行数をそれぞれ示します。

Zshが「無限」を意味する設定を持っているとは思いませんが、実際には、10億は無限ですが、32ビットマシンでマシンを表すことができます。

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE

Oh-my-zshが独自のHISTSIZESAVEHISTの値を設定していることに気づくまで、履歴が10000で制限されるという問題がありました。 TL; DR、.zshrcの一番下に行を入れてください。

もう1つの問題は、履歴が1024行に切り捨てられることでした。理由はわかりませんが、次のようにして解決しました。

  • HISTFILE=$HOME/.zsh_histの設定(以前とは異なるもの)
  • HISTFILE=$HOME/.bash_history~/.bashrcを明示的に設定する
  • HISTSIZE=100000SAVEHIST=100000などの通常の設定を行う

これは、exportを使用してHISTFILEを設定し、ZSHからインタラクティブに起動したときにbashが同じHISTFILE変数を使用して切り捨てられることに関連している可能性があります。 exportHISTFILEを使用しないことを確認する限り、おそらくbash履歴ファイルを設定する必要はありません。

問題はzshまたは私の.zshrcではなく、私の履歴にありました。のようないくつかの変なエントリ

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@#1453692179

混乱したzshと、これらのエントリの後のすべてが切り捨てられました。 ^@がどの文字に対応するのか、またはこれらのエントリが私の履歴にどのように残っているのかわかりませんが、削除することで問題が解決しました。

1
pfnuesel