web-dev-qa-db-ja.com

ZSH履歴が失われるのはなぜですか?

たまにzsh履歴が切り捨てられている(または完全に失われている、わかりにくい)ことがときどきあり、バックアップから復元する必要があります。

たとえば、今日:

ls -lh ~/.zsh_history
-rw-------  1 stripe  staff    32K 21 Feb 10:20 /Users/stripe/.zsh_history

しかし、数日前の私のバックアップでは:

-rw-------@  1 stripe  staff  203K 17 Feb 22:36 /Volumes/Time Machine Backups/.../Users/stripe/.zsh_history

多くの履歴を保存するようにzshを構成したので、シェルが意図的にファイルをトリミングする必要はありません。

unsetopt share_history
setopt inc_append_history
setopt hist_ignore_all_dups
HISTSIZE=500000
SAVEHIST=$HISTSIZE

他の誰かがこれを経験し、それを軽減する方法を見つけましたか?知らないzsh春の大掃除機能はありますか?

5

[〜#〜] zsh [〜#〜]

履歴ファイルは、次のようないくつかの理由で切り捨てられたり、失われたり、削除されたりすることがあります。

  • Zsh履歴ファイルの破損(シェルが開かれているときにpower-cut/system-failが原因で、この場合、システム障害時にfsckを実行するように設定する必要があります)
  • Zsh設定ファイルがロードされていません(たとえば、$home環境変数が定義されていません)
  • サポートされていない 履歴ファイルの文字 はzshに履歴をリセットさせる
  • ブリーチビットのようなクリーニングツール
  • Zshの設定ミス
  • 等.

注記

利用可能な履歴設定オプション

HISTFILE="$HOME/.zsh_history"
HISTSIZE=500000
SAVEHIST=500000
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.

回答

この状況では、次の構成が推奨されます(~/.zshrcファイル)

HISTFILE=/specify/a/fixed/and/different/location/.history
HISTSIZE=500000
SAVEHIST=500000
setopt appendhistory
setopt INC_APPEND_HISTORY  
setopt SHARE_HISTORY

代替

履歴ファイルのサイズを確認し、必要に応じてバックアップから復元する小さなスクリプトを使用できます(~/.zshrc

if [ /home/my/zsh/hist/file -lt 64000 ]; then
    echo "History file is lower than 64 kbytes, restoring backup..."
    cp -f /mybackup/histfile /home/my/zsh/hist/file
fi

リンク

追加情報は this および this の質問で利用できます。

4
intika

私にも同様の問題があり、今日それを理解しました。

私はSAVEHIST=10000を設定するoh-my-zshを使用しています。私の履歴は10,000行を超えていましたが、最も古いコマンドが削除されて、新しいコマンドが入る余地ができたと思います。10kは大丈夫でした。ただし、デバッグしているoh-my-zshに別の問題があり、ある時点でzshrcから. $ZSH/oh-my-zsh.shを完全に削除したため、SAVEHISTがデフォルトにリセットされました1000の値、およびzshは他の9000行を履歴ファイルから即座に削除しました。これが発生したときに別のターミナルウィンドウを開いている場合でも、そのウィンドウからhistoryを実行して完全な履歴を表示できますが、そのセッションを閉じると、永久に失われます(もちろん、バックアップがある場合を除きます)。

1
Daniel Marks