zsh history is too short

ZshHistory

Zsh Problem Overview


When I run history in Bash, I get a load of results (1000+). However, when I run history the zsh shell I only get 15 results. This makes grepping history in zsh mostly useless. My .zshrc file contains the following lines:

HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory

How can I fix zsh to make my shell history more useful?


UPDATE

If in zsh I call history 1 I get all of my history, just as I do in Bash with history. I could alias the command to get the same result, but I wonder why does history behave differently in zsh and in Bash.

Zsh Solutions


Solution 1 - Zsh

NVaughan (the OP) has already stated the answer in an update to the question: history behaves differently in bash than it does in zsh:

In short:

  • zsh:
    • history lists only the 15 most recent history entries
    • history 1 lists all - see below.
  • bash:
    • history lists all history entries.

Sadly, passing a numerical operand to history behaves differently, too:

  • zsh:
  • history <n> shows all entries starting with <n> - therefore, history 1 shows all entries.
  • (history -<n> - note the - - shows the <n> most recent entries, so the default behavior is effectively history -15)
  • bash:
  • history <n> shows the <n> most recent entries.
  • (bash's history doesn't support listing from an entry number; you can use fc -l <n>, but a specific entry <n> must exist, otherwise the command fails - see below.)

Optional background info:

  • In zsh, history is effectively (not actually) an alias for fc -l: see man zshbuiltins
    • For the many history-related features, see man zshall
  • In bash, history is its own command whose syntax differs from fc -l
    • See: man bash
  • Both bash and zsh support fc -l <fromNum> [<toNum>] to list a given range of history entries:
    • bash: specific entry <fromNum> must exist.
    • zsh: command succeeds as long as least 1 entry falls in the (explicit or implied) range.
    • Thus, fc -l 1 works in zsh to return all history entries, whereas in bash it generally won't, given that entry #1 typically no longer exists (but, as stated, you can use history without arguments to list all entries in bash).

Solution 2 - Zsh

#set history size
export HISTSIZE=10000
#save history after logout
export SAVEHIST=10000
#history file
export HISTFILE=~/.zhistory
#append into history file
setopt INC_APPEND_HISTORY
#save only one command if 2 common are same and consistent
setopt HIST_IGNORE_DUPS
#add timestamp for each entry
setopt EXTENDED_HISTORY   

this is my setting, and it work

Solution 3 - Zsh

Perhaps late however coming across this post and trying to apply it, and failed .... so in practical terms, put this in .zshrc :

alias history='history 1'

and you'll see anything until the HIST_SIZE runs out. To find a command I use (after the .zshrc change)

history | grep "my_grep_string"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNVaughanView Question on Stackoverflow
Solution 1 - Zshmklement0View Answer on Stackoverflow
Solution 2 - ZshSeanView Answer on Stackoverflow
Solution 3 - ZshBananamanView Answer on Stackoverflow