Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

zsh history is too short

Tags:

zsh

history

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.

like image 562
NVaughan Avatar asked Nov 10 '14 15:11

NVaughan


People also ask

Where is ZSH history stored?

ZSH is a popular shell built on top of bash. It stores your command history in the . zsh_history file in your home directory. If your ZSH shell does not support command history by default, check out our zsh command history article to learn how to enable it.

Which is better bash or ZSH?

Zsh is built on top of bash thus it has additional features. Zsh is the default shell for macOS and Kali Linux. Zsh provides the user with more flexibility by providing various features such as plug-in support, better customization, theme support, spelling correction, etc.

What is the command to show my last 16 commands from my history?

Use the history command to list commands that you have previously entered. The history command is a Korn shell built-in command that lists the last 16 commands entered. The Korn shell saves commands that you entered to a command history file, usually named $HOME/. sh_history.


2 Answers

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).
like image 68
mklement0 Avatar answered Oct 11 '22 12:10

mklement0


#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

like image 26
Sean Avatar answered Oct 11 '22 11:10

Sean