Os parágrafos seguintes descrevem a ideia em geral e estão desatualizados em alguns aspectos, mas você pode usar e usar o mais recente de esta página.
Vamos usar um arquivo grande ~ / .bash_history.archive (separado de HISTFILE = ~ / .bash_history).
E então, ao sair de cada sessão bash, vamos adicionar novas linhas de histórico a ele.
O primeiro problema com essa abordagem foi:
como fazer bash para chamar esse script em cada saída?
Claro que se você sair digitando 'exit' então você pode alias 'exit' funcionar mas eu uso o atalho Ctrl-D para isso e
Não consegui encontrar uma maneira de reatribuí-lo a algo, mas não a função de saída integrada.
Então a primeira tentativa foi: proibir Ctrl-D por
export IGNOREEOF=10
e defina a combinação Ctrl-X dupla para chamar a função de saída.
Mas a abordagem correta é usar o tramp de saída do bash, que é uma solução perfeita porque é chamado independentemente da forma como você sai do bash:
Ctrl-D, sair, fechar a janela do xterm.
trap 'archive_history' EXIT
O próximo passo é definir uma linha de partida em nosso bash_history para que possamos salvar apenas novas linhas e nos certificar de que anexamos a um arquivo de histórico.
export CURBASHSTART='grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'' CURBASHDATE='date'
shopt -s cmdhist histappend
Isso é tudo o que precisamos no início do bash - agora sabemos de qual linha da história a história atual (nova) começa. Para salvar o histórico, adicione a próxima peça ao seu ~ / .bashrc.
archive_history()
{
HISTORYOLD=${HISTFILE}.archive
CURTIME='date'
CURTTY='tty'
if [ x$HISTDUMPPED = x ]; then
echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >> $HISTORYOLD
history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g' >> $HISTORYOLD
export HISTDUMPPED=1
fi
}
exit ()
{
archive_history
builtin exit
}
O arquivo ~ / .inputrc deve conter as próximas linhas para redefinir o atalho de saída para Ctrl-x x. Numa primeira tentativa você pode achar que é um atalho terrível, mas depois se acostuma com isso - acredite em mim.
$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"
$endif
Além disso, se a sessão do bash for uma sessão de login e você sair chamando ' logout
', adicione a próxima linha ao seu ~/.bash_logout
archive_history
Depois que todas as ações mencionadas forem concluídas, você poderá encontrar o arquivo ~/.bash_history.archive
contendo seções como estas
#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----
exit
cd progr/letters/resume/
e resume.tex
que em geral pode ser lido como arquivo de histórico normal, se desejar.