Permanent shell history in zsh
I like to keep a permanent record of my shell commands so I can search back through them later. This involves two steps:
- Setup your zsh to save the history on each invocation
- Create an alias to quickly search through the commands, with the newest on top
Place the following in your ~/.zshrc
file
setopt extended_history # save timestamp
setopt inc_append_history # add history immediately after typing a command
precmd() { # This is a function that will be executed before every prompt
local date_part="$(/opt/homebrew/bin/gawk 'substr($0, 0, 1) == ":" {print;}' ~/.zsh_history | tail -1 | cut -c 3-12)"
local fmt_date="$(date -j -f '%s' ${date_part} +'%Y-%m-%d %H:%M:%S')"
# For newer versions of "date", comment the last line and uncomment the next line
# local fmt_date="$(date -d @${date_part} +'%Y-%m-%d %H:%M:%S')"
local command_part="$(tail -1 ~/.zsh_history | cut -c 16-)"
if [ "$command_part" != "$PERSISTENT_HISTORY_LAST" ]
then
echo "${fmt_date} | ${command_part}" >> ~/.sh_eternal_history
export PERSISTENT_HISTORY_LAST="$command_part"
fi
}
# Load alias commands
. ~/.zsh_aliases
Place the following in your ~/.zsh_aliases
file:
alias findhist='tail -r ~/.sh_eternal_history | grep -m 10'
Load into the current session:
source ~/.zshrc
Invoke:
findhist "ls -la"
# find more than 10 by specifying `-m`:
findhist -m 25 "ls -la"
(Adapted from https://stackoverflow.com/a/30272351/3439097)