TransWikia.com

Why do I have duplicates in my zsh history?

Unix & Linux Asked on November 14, 2021

> zsh --version
zsh 5.7.1 (x86_64-apple-darwin19.0)
> setopt
alwaystoend
autocd
autopushd
combiningchars
completeinword
correct
extendedhistory
noflowcontrol
histexpiredupsfirst
histignorealldups
histignorespace
histreduceblanks
histsavenodups
histverify
interactive
interactivecomments
login
longlistjobs
monitor
promptsubst
pushdignoredups
pushdminus
sharehistory
shinstdin
zle
> cat ~/.zsh_history
: 1595363811:0;ls 2&>1 /dev/null
: 1595363821:0;ls /dev/null
: 1595363831:0;cat ~/.zsh_history
: 1595363837:0;ls /dev/null
: 1595363841:0;setopt
: 1595363845:0;cat ~/.zsh_history
: 1595363993:0;setopt
: 1595364000:0;ls
: 1595364009:0;cat ~/.zsh_history

It is ignoring them if they are one after the other like histignoredups but AFAIK, my configuration should ignore any and all.

> cat ~/.zshrc ~/.zshenv ~/.zprofile
# secrets-management -> master
###
#this file is generated edit ~/.config/yadm/alt/.gitconfig
##template instead
###

# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH="/Users/calebcushing/.oh-my-zsh"

# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="typewritten"
TYPEWRITTEN_CURSOR="block"
TYPEWRITTEN_RIGHT_PROMPT_PREFIX="# "
TYPEWRITTEN_GIT_RELATIVE_PATH=true


# Set list of themes to pick from when loading at random
# Setting this variable when ZSH_THEME=random will cause zsh to load
# a theme from this variable instead of looking in ~/.oh-my-zsh/themes/
# If set to an empty array, this variable will have no effect.
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"

# Uncomment the following line to disable bi-weekly auto-update checks.
# DISABLE_AUTO_UPDATE="true"

# Uncomment the following line to automatically update without prompting.
DISABLE_UPDATE_PROMPT="true"

# Uncomment the following line to change how often to auto-update (in days).
# export UPDATE_ZSH_DAYS=13

# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS=true

# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"

# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"

# Uncomment the following line to display red dots whilst waiting for completion.
# COMPLETION_WAITING_DOTS="true"

# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"

# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# or set a custom format using the strftime function format specifications,
# see 'man strftime' for details.
# HIST_STAMPS="mm/dd/yyyy"

# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder

ZSH_COLORIZE_STYLE="monokai"

# Which plugins would you like to load?
# Standard plugins can be found in ~/.oh-my-zsh/plugins/*
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(
  colored-man-pages
  colorize
  command-not-found
  direnv
  history-substring-search
  gitfast
  git-auto-fetch
  git-escape-magic
  gitignore
  magic-enter
  safe-paste
  scd
  themes
  z
)

source $ZSH/oh-my-zsh.sh

# User configuration

source $HOME/.config/my/rc.sh

# export MANPATH="/usr/local/man:$MANPATH"

# You may need to manually set your language environment
# export LANG=en_US.UTF-8

# Preferred editor for local and remote sessions
export EDITOR='vim'
export VISUAL='vim'

# Compilation flags
# export ARCHFLAGS="-arch x86_64"

# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.


# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

alias vi="vim -Xp"
alias vim="vim -Xp"

jdk() {
  version=$1
  export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
  java -version
}

setopt CORRECT
setopt SHARE_HISTORY
setopt HIST_IGNORE_ALL_DUPS
unsetopt HIST_IGNORE_DUPS

export LESS="-R --no-init --quit-if-one-screen"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export HISTSIZE="1000"


eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"

Second question: Should I setopt in ~/.zshrc or ~/.zshenv?

2 Answers

Add the following lines to your ~/.zshrc file to avoid duplicates in history

setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_FIND_NO_DUPS
setopt HIST_SAVE_NO_DUPS

Answered by VVK on November 14, 2021

The only option needed to trim all duplicates is histignorealldups, and you have it already set, so yes, duplicates are being removed

but from memory

And you are looking to the history stored in file (cat $HISTFILE).

how to reproduce

Start a new zsh instance, erase all history entries and execute some commands

% zsh -i
% a=( $(setopt) )
% unsetopt $a
% HISTSIZE=0
% HISTSIZE=99
% history
   95  HISTSIZE=99
% setopt INC_APPEND_HISTORY
% ls >/dev/null
% clear
% ls >/dev/null
% history
  113  HISTSIZE=99
  114  history
  115  setopt INC_APPEND_HISTORY
  116  ls >/dev/null
  117  clear
  118  ls >/dev/null

Now, you can set the option histignorealldups and all duplicates will disappear (from memory):

% setopt histignorealldups
% history
  113  HISTSIZE=99
  115  setopt INC_APPEND_HISTORY
  117  clear
  118  ls >/dev/null
  122  setopt histignorealldups

But that doesn't mean that the lines have been erased from the history file:

% cat ~/.histfile | tail -n 10
setopt INC_APPEND_HISTORY
ls >/dev/null
clear
ls >/dev/null
history
setopt histignorealldups
history
setopt histignorealldups
history
cat ~/.histfile | tail -n 10

To remove duplicates from the file you would have to edit the file.

I recommend you don't do that, as the history might be shared by several zsh instances running in parallel. This is not a trivial problem.

Answered by ImHere on November 14, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP