For "normal" use in the terminal, a unified single history file is easier to deal with. For example, yesterday I was doing some forensics on the existence of mystery files in my backups from years ago and it was nice just loading up a single history file in the editor ... page up and page down repeatedly to eventually reconstruct the sequence of commands that explained the mystery files. The alternate idea of separate history files is less ergonomic for that. I'd have to open each history file (potentially hundreds) one by one in the editor. Trying to treat separate history files as "virtual single file" by using grep on the whole batch wouldn't work because I didn't know ahead of time what string to grep for. It required manually eyeballing the commands to consider which ones were the culprit. (Yes, if history files were separate, I could also concatenate "cat" them all to a temp file and load that into an editor ... but a history file that's already unified means I don't have to bother with that step and delete that temp file after I'm done.)
>HISTFILE="$HOME/zsh/$(date '+%y:%m%d:%H%M')-$$"
However, for "not normal" usage of a shell in a coding editor, I do create separate history files with a timestamp like your suggestion. In dev environments, I tend to create lots of dirty throwaway shell commands and I don't want them polluting the "normal" shell history.
cat $HOME/zsh/*
should be easy to copy-paste or pipe it to an editor.i mean, the problem of viewing all history files at once is much easier than writing to the same one file from multiple sessions.
mkdir -p $HOME/zsh
HISTFILE="$HOME/zsh/$(date '+%y:%m%d:%H%M')-$$"
echo "HISTFILE $HISTFILE"
for easily accessing the history without running grep... will figure it out later :)))Then I kept reading and the author mentions accidentally exporting HISTFILE[1] and I screamed in terror and ran to my computer as I realized a mistake I’ve been making for…ever.
I am now both happy and sad I read this article.
[1] https://github.com/stapelberg/configfiles/commit/32dcda0f49a...
Have you ever looked back on your history?
I used to start my history over with each PC, but last year when I upgraded my primary machine I decided to copy over my browser history and shell history in addition to the usual dotfiles and stuff. It's honestly been really nice and convenient. It almost feels like cheating that I can see stuff older than the machine that I did.
I also hold over a decade worth of zsh history and revisit it from time to time to reconstruct the full memory of what I was working on N years ago.
Same
> Have you ever looked back on your history?
All the time? I search in my history, re-launch past commands, etc.
Now it's typically recent history, usually same day.
I know about the shortcuts etc. but I also need to at times pipe history into other commands so I've got a two letters alias:
h?
Which greps into my history. I use that h? all the time.If you haven't looked into ZSH, it has some really nice customizations. Notably, from my config[1]:
# Remove dups
setopt HIST_FIND_NO_DUPS
setopt HIST_IGNORE_DUPS
# Don't log commands starting with a space
setopt HIST_IGNORE_SPACE
# Replcae bang-command !34 with the actual command in the history
setopt BANG_HIST
# Remove extraneous spaces
setopt HIST_REDUCE_BLANKS
# Write the history file in the ":start:elapsed;command" format
setopt EXTENDED_HISTORY
# Record run-time of the command
setopt INC_APPEND_HISTORY_TIME
[1] https://doc.xn0.org/.zshrcYou can't expect much from a system that has those defaults, I'm all for traditions, but if I were to depend on a system for command history, it wouldn't be anything that reads a bash_history, a revolution is needed, not incremental optimizations
P.s: what I do is set it to unlimited on both size and line count, but it's not a forensic grade audit trace, we'd need an OS, or ssh command logger, preferably one that writes to an external disk, but it can be to a root controlled file, definitely not to a user owned file.
Security protects not only against attackers, but against bugs, a user's command history should not be deletable by user. Anything else is a wrong architecture that we are just carrying by inertia and laziness.
[[ -n `find . -maxdepth 1 -name .zsh_history -size -10k` ]] && echo "ZSH history is empty!!!"
I switched to my custom fork of stinkpot posted a few days ago here, and it's so nice. I did have to add current-for filtering, but that was easy.