理想未来ってなんやねん

娘可愛い。お父さん頑張る。

bash 履歴の管理

bashの履歴管理に関するメモ

重複する履歴は記録しない

HISTCONTROLにignoredupsを指定する事で、二回以上連続実行したコマンドは履歴として記録しないようにすることが出来ます。

export HISTCONTROL=ignoredups 

空白から始めたコマンドを保存しない

HISTCONTROLにignorespaceを指定する事で、空白から始めたコマンドは履歴として記録しないようにすることが出来ます。

export HISTCONTROL=ignorespace

ignoredupsとignorespaceを組み合わせる

ignoredupsとignorespaceを組み合わせで設定する場合は、HISTCONTROLにignorebothを設定します。

export HISTCONTROL=ignoreboth

特定の履歴は残さない

特定の履歴を残さないようにするにはHISTIGNOREを設定します。

export HISTIGNORE='history:ls*:ll*:fg*:bg*:pwd'

履歴のサイズを指定する。

履歴はサイズはHISTSIZEおよびHISTFILESIZEで設定します。

HISTSIZE=40000
HISTFILESIZE=40000

コマンドを実行したタイムスタンプを記録する

デフォルトの状態ではコマンドを実行した時刻まで表示することができません。
historyでコマンドを実行した時間を調べれるようにするには、HISTTIMEFORMATを設定します。

HISTTIMEFORMAT="%y/%m/%d %H:%M:%S : "

複数端末間でコマンド履歴を共有する

端末を同時に複数立ち上げていると、端末間で履歴の共有ができなくて不便です。


下記のサイトに複数端末間でコマンド履歴を共有する方法が記載されています。
iandeth. - bashにて複数端末間でコマンド履歴(history)を共有する方法

function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend

古い履歴を纏める

bashを使い込むうちに だんだんと.bash_historyが長くなってきます。
又、実行したコマンドの重複も増えてきますので見通しが悪くなります。


そこで古い履歴をまとめるスクリプトを作成してみました。
.bash_profileなどに記載してログイン時に実行すると良いかと思います。

#毎回行わず前回纏めてから1日以上経過している時に整理を行う。
if [ ! -f ~/.bash_history~ -o "`find ~/.bash_history~ -type f -mtime +1 2> /dev/null`" != "" ];
then
    #整理を行う前にバックアップを取っておく
    cp -fp ~/.bash_history ~/.bash_history~

    FIRSTHALF=~/.bash_history_firsthalf
    LASTHALF=~/.bash_history_lasthalf
    HISTTIME=0

    # 90日以前の履歴を纏める
    TIMELIMIT=`expr \`date '+%s'\` - 86400 \* 90`
    OUTFILE=${FIRSTHALF}
    rm -f ${LASTHALF} ${FIRSTHALF}

    # .bash_history を90日より前の履歴と90日以内の履歴に分ける。
    # 90日より前の履歴はタイムスタンプを削除する
    while read LINE
    do
        FIRSTCHAR=${LINE:0:1}
        if [ "${FIRSTCHAR}" = "#" ];  
        then
            HISTTIME=${LINE#\#}
            if [ ${HISTTIME} -gt ${TIMELIMIT} ];  
            then
                OUTFILE=${LASTHALF}
                echo ${LINE} >> ${OUTFILE}
            fi  
        else
            echo ${LINE} >> ${OUTFILE}
        fi  
    done < ~/.bash_history

    # 90日以前の履歴はソートを行った上でuniqなものだけ残す
    cat ${FIRSTHALF} | sort | uniq > ~/.bash_history
    cat ${LASTHALF} >> ~/.bash_history
    rm -f ${FIRSTHALF} ${LASTHALF}
fi