71

Whenever I open a new instance of a terminal, the history is empty. Why is that? Do I need to set something up? In bash there's no need for this, though.

2
  • 2
    Not sure about zsh, but by default bash writes to his history files upon exit, which means if you have not used it before and open some shells, they will all show now history until at least one logs out, thereby writing its history file.
    – DopeGhoti
    Commented Sep 1, 2017 at 22:34
  • It is my experience that this issue varies by OS and the specific zsh setup. Commented Aug 14, 2022 at 15:34

5 Answers 5

80

Bash and zsh have different defaults. Zsh doesn't save the history to a file by default.

When you run zsh without a configuration file, it displays a configuration interface. In this configuration interface, select

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)

then review the proposed settings and select

# (0)  Remember edits and return to main menu (does not save file yet)

Repeat for the other submenus for (2) completion, (3) keybindings and (4) options, then select

(0)  Exit, saving the new settings.  They will take effect immediately.

from the main menu.

The recommended history-related settings are

HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory

I would use a different name for the history file, to indicate it's zsh's history file. And 1000 lines can be increased on a modern system.

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt appendhistory

These lines go into ~/.zshrc, by the way.

9
  • How to run zsh without a configuration file?
    – Arnold Roa
    Commented Dec 28, 2020 at 0:56
  • @ArnoldRoa zsh -f Commented Dec 28, 2020 at 12:40
  • 1
    @ScottWelker MacOS comes with a system configuration file (/etc/zshrc) that sets up a few things including a slightly fancier prompt and per-terminal history. zsh -f ignores this file so you just get the default prompt and no saved history. If you have no configuration file anyway, zsh -f doesn't change anything compared to just running zsh. Commented Aug 14, 2022 at 15:22
  • 1
    @ScottWelker As I explain in my answer, you need to tell zsh to save the history, it doesn't do it by default. MacOS has a system configuration that enables history saving, but Linux distributions usually don't. Commented Aug 14, 2022 at 17:36
  • 1
46

While the existing answer is correct, I thought it might be worth adding that there's possibly a better option than appendhistory for saving your history and this is SHARE_HISTORY.

From the docs SHARE_HISTORY "both imports new commands from the history file, and also causes your typed commands to be appended to the history file". This means that shells are aware of each other's history as well without having to close the current one or open a new one.

So, all together you'd set it like this:

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=1000
setopt SHARE_HISTORY
4
  • 11
    +1 and welcome to U/L, but personally I prefer INC_APPEND_HISTORY_TIME, which writes to history from all terminals as above, but that history "will not be available immediately from other instances of the shell that are using the same history file". This makes more sense to me, because then I can traverse each terminal's history independently, but it's still all logged.
    – Sparhawk
    Commented Sep 22, 2018 at 13:16
  • 2
    Thanks! Yeah that's fair enough and I can totally see why INC_APPEND_HISTORY_TIME might make more logical sense. I probably shouldn't have said "better", I guess it's just a matter of personal preference at this point!
    – bert
    Commented Sep 22, 2018 at 13:19
  • 1
    how to use INC_APPEND_HISTORY_TIME ?
    – Arnold Roa
    Commented Dec 28, 2020 at 0:59
  • setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits.
    – natersoz
    Commented Dec 14, 2022 at 17:44
15

If it isn't working, and you have all of this already in place, try:

fc -W

That writes the current history to the history file. And if you get:

zsh: locking failed for /home/username/.zsh_history: permission denied

then it's time to check permissions on the file and on the parent directory.

8
  • This did it for me. Using chown to change this file ownership solved the issue. Thanks
    – SubMachine
    Commented Aug 12, 2021 at 4:49
  • If this happens, you would most probably want to reset the permissions by the following command diskutil resetUserPermissions / `id -u` Commented Dec 4, 2021 at 15:19
  • diskutil is a MacOS command however.
    – Marc
    Commented Jan 17, 2022 at 7:18
  • 1
    What does fc stand for?
    – vy32
    Commented Feb 21, 2022 at 2:05
  • 2
    fc is s shell builtin command for working with history. See zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html and search for fc. Commented Feb 22, 2022 at 3:08
1

when you first switch over from bash to zsh, your bash history will not carry over. So all the history you had in bash is still in bash's history file. zsh starts capturing history from the time you start using it as your shell.

If you did not set it up to capture history, you can re-run the config wizard and tell zsh how much history to save. Either change the name of ~/.zshrc or delete it to get a new shot at the wizard.

1

Use alias:

alias history="history 1"

You can add this to .zprofile

To test, see the difference: history history 1

1
  • 3
    That won’t help if the history isn’t being stored in the first place, as explained in the other answers. Commented Nov 9, 2020 at 15:54

You must log in to answer this question.