Como: Histórico ilimitado de Bash / shell?

83

Existe uma maneira de definir um histórico ilimitado no Bash?

Dragos
fonte

Respostas:

82

Adicione isso ao seu .bashrc(Linux) ou .bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

Lá vai você, história ilimitada. Atualmente tenho 27000 entradas :)

De man bash:

Se HISTFILESIZEnão estiver definido, nenhum truncamento será executado.

Isso significa que .bash_historynunca é truncado

Também parece que o mesmo se aplica HISTSIZE, embora eu não tenha achado isso documentado.

Outro recurso interessante que vou tentar é o seguinte:

Se a HISTTIMEFORMATvariável estiver definida, os carimbos de hora serão gravados no arquivo de histórico, marcados com o caractere de comentário do histórico, para que possam ser preservados nas sessões do shell, como a seguir:

export HISTTIMEFORMAT="%F %T "

Deixe-me saber se você já tentou isso ...

morgenrot
fonte
3
Na verdade, isso não funciona em muitos casos e o histórico do bash ainda é truncado. Veja minha resposta abaixo para uma solução mais completa.
Fotinakis
2
Aviso: isso causa dores de cabeça com gdb; se você definir uma HISTSIZEvariável, ela será aceita como 0, desativando assim o tamanho do histórico por completo.
Matteo Italia
2
notas: você não precisa export, HISTFILESIZEestá em número de linhas (não bytes), e o truncamento do arquivo de histórico acontece quando você define a variávelHISTFILESIZE (e quando o shell sai). Portanto, não configurá-lo duas vezes em seu arquivo de configuração com valores diferentes ...
vaab
@vaab: se eu não exportar o HISTFILE, não consigo ver o que o meu arquivo de histórico está usando "echo $ HISTFILE" em subshells; portanto, embora não seja necessário, pode ser útil e não causa danos que eu possa detectar.
precisa
41

(republicando minha resposta em https://stackoverflow.com/a/19533853/128597 )

Depois de muitas iterações grandes e feias e casos extremos estranhos ao longo dos anos, agora tenho uma seção concisa do meu .bashrc dedicado a isso.

Primeiro, você deve comentar ou remover esta seção do seu .bashrc (padrão para Ubuntu). Caso contrário, determinados ambientes (como screensessões em execução ) ainda truncarão seu histórico:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

Segundo, adicione isso na parte inferior do seu .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Nota: todos os comandos são gravados imediatamente após a execução; portanto, se você colar acidentalmente uma senha, não poderá simplesmente "matar -9 %%" para evitar a gravação do histórico, será necessário removê-la manualmente.

Observe também que cada sessão do bash carregará o arquivo de histórico completo na memória, mas mesmo que seu arquivo de histórico cresça para 10 MB (o que levará muito, muito tempo), você não notará muito efeito no tempo de inicialização do bash.

fotinakis
fonte
4
O arquivo de histórico fica truncado quando você define HISTFILESIZE, é por isso que você deve remover qualquer ocorrência desse evento, exceto a desejada. Também será truncado na saída do shell (mas isso é esperado). E você não deveria precisar export.
vaab
3
@vaab Se você não exportar, fazer algo como truncará bash --norco histórico novamente.
Yongwei Wu
1
Eu uso export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"para manter o histórico do shell separado por sessão (com base no nome do host e no nome do tty). Claro que tenho que criar o diretório ~ / hist primeiro.
precisa
2
Observe que você pode verificar o valor de PROMPT_COMMAND e não anexá-lo cegamente repetidamente, pois isso fará coisas malucas no seu sistema. Uma verificação nula ou, melhor ainda, uma pesquisa de expansão de variável de shell provavelmente é mais segura.
dragon788
3
Eu uso isso para evitar o problema @ dragon788 referido:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg
9

Incluir em ~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Esta resposta atende aos seguintes critérios:

  1. um histórico mestre separado (nenhuma sessão pode interromper seu histórico)

  2. gravação automática de histórico (sem teclas de atalho)

  3. gravações pouco frequentes (sem anexar após cada comando)

fundo

Na inicialização interativa, se $HISTFILESIZEestiver definido como um número, o bash trunca $HISTFILEpara esse número. No fechamento interativo, se a opção shell histappendestiver definida, o bash anexa $HISTSIZElinhas a $HISTFILE, caso contrário, ele substitui $HISTFILE.

dicas para OSX (Terminal)

Toda vez que uma guia é criada no Terminal, ~/.bash_profileé lida, o que significa que o bash não lê sua ~/.bashrc. Adicione a seguinte linha ao seu ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

dicas para tela

Se você usa a tela, seu arquivo de configuração é ~ / .screenrc. Se você deseja que a tela registre o histórico, basta configurá-lo para usar um shell de login que fornecerá seus arquivos de inicialização do bash (e registrará seu histórico).

# use bash, make it a login shell
defshell -bash
cdosborn
fonte
3

Um conceito diferente (pode não ser aplicável), mas você pode ter unlimitedhistórico ao usar o shell-sink .

ChristopheD
fonte