Logging Shell History in Zsh |
December 20th, 2022 |
shell, tech |
I use bash
as my shell and have long
used:
.bashrc: promptFunc() { echo "$(date +%Y-%m-%d--%H-%M-%S) $(hostname) $PWD $(history 1)" \ >> ~/.full_history } PROMPT_COMMAND=promptFunc
I was recommending this to folks at work, but they use
zsh
. In zsh
you can get a lot of the way
here by setting INC_APPEND_HISTORY
(append to history
immediately instead of waiting for the shell to exit),
SAVEHIST=1000000000
(effectively don't limit the history
size on disk), and EXTENDED_HISTORY
(to store timestamps
with history entries). But you risk losing most of your history if you
ever accidentally invoke zsh
without these set, and it
doesn't write the directory you ran the command in (which is metadata
I reference a lot).
Mike tweaked my snippet to run in
zsh
:
.zshrc: precmd() { echo "$(date +%Y-%m-%d--%H-%M-%S) $(hostname) $PWD $(history -1)" \ >> ~/.full_history }
The two changes are that zsh
uses precmd
instead of PROMPT_COMMAND
, and that you need
history -1
instead of history 1
.
You can still use the same histgrep
command on both:
function histgrep { local n_lines=10 if [[ "$1" =~ ^[0-9]*$ ]]; then n_lines="$1" shift fi grep "$@" ~/.full_history | tail -n "$n_lines" }
Note that this doesn't replace your shell's built-in history tooling, and I wouldn't recommend turning that off. This just a very cheap additional layer of logging with additional metadata and less risk of accidental deletion.
Comment via: facebook, lesswrong, mastodon