#!/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