#!/bin/bash
umask 077
max_lines=10000
linecount=$(wc -l < ~/.bash_history)
if (($linecount > $max_lines)); then
prune_lines=$(($linecount - $max_lines))
head -$prune_lines ~/.bash_history >> ~/.bash_history.archive \
&& sed -e "1,${prune_lines}d" ~/.bash_history > ~/.bash_history.tmp$$ \
&& mv ~/.bash_history.tmp$$ ~/.bash_history
fi
via BashFAQ/088 – Greg’s Wiki.
I needed to manage shell command history in a formal fashion in order to turn repeated sequences into scripts without having to type them in again. I also wanted a record of packages installed and in what order. The history of commands is contained in .bash_history file which is read once when a terminal opens. Running set -o vi allows for history commands to be recalled using standard vi commands. The above script can be run as a user level cron job to periodically prune the top so many commands and place them into an archive.
The bash statements below set history size and make it so a command will be written to the history file immediately and not simply when a terminal closes. These should be placed in .bashrc or whatever file executes when a new terminal opens.
HISTFILESIZE=400000000 HISTSIZE=10000 PROMPT_COMMAND="history -a" export HISTSIZE PROMPT_COMMAND shopt -s histappend