Como fazer o bash manter as entradas de histórico mais usadas para sempre?

5

As duplicatas já estão desativadas, mas isso não é suficiente (sinto que preciso inserir comandos com muita frequência).

Suponha que eu tenha uma capacidade de 2000 entradas de bash history e um comando que usei com muita frequência ( n times) no passado, mas não recentemente, e quero usá-lo novamente agora. Suponha que este comando esteja na posição mais antiga do histórico e seja removido após a próxima execução de comando não duplicado. Eu gostaria que esse comando fosse preservado e o comando mais antigo (com a contagem de uso < n ) fosse removido do histórico.

Pode-se argumentar que isso faz com que o histórico de bash não seja mais uma história (linear). Eu concordo, mas não me importo, pois quero acesso fácil aos meus comandos favoritos (sendo coletados automaticamente).

Estou usando o bash 4.3.42 no Ubuntu 15.10.

    
por Karl Richter 27.11.2015 / 03:47

1 resposta

4

Aviso: Esta não é uma resposta à pergunta apresentada, mas sim uma sugestão para uma abordagem que pode ser útil.

Eu sinto sua dor. Eu gosto de manter em torno do meu histórico Bash, e ser capaz de lembrar comandos que eu poderia ter corrido há muito tempo. Eu desenvolvi uma abordagem que me permite manter todo o meu histórico Bash dentro de um tamanho histórico razoável.

  1. minhas configurações do histórico de Bash são:

    HISTCONTROL=ignoreboth:erasedups
    HISTIGNORE="?:??:???:$HISTIGNORE"
    

    Isso ajuda a manter inativas as entradas que acabam no histórico de Bash. Comandos como ls são mais curtos para digitar do que para recuperar, então não há sentido em armazená-los (é para isso queHISTIGNORE serve). ignoreboth é uma abreviação de ignorespace e ignoredups . O primeiro impede que as entradas com um espaço à esquerda acabem no histórico. Eu o uso para comandos que sei que nunca vou lembrar, ou nunca quero lembrar, como rm -rf * :). Há muito mais coisas que eu ignoro por padrão (não mostrado), o que mantém o tamanho do histórico.

  2. Apesar das contramedidas acima, as duplicatas ainda acabam no meu histórico (por exemplo, devido a vários shells do Bash abertos ao mesmo tempo). Eu tenho um contador no meu prompt que me mostra o tamanho do histórico atual

    PS1='\u@\h:\w:\!> '
    

    (O código relevante é \! , a.k.a. número histórico deste comando .) Isso me mostra quando é hora de 'limpar' (veja o próximo passo).

  3. Periodicamente, "limpo" meu histórico de Bash executando o seguinte comando:

    tac ~/.bash_history | awk '!seen[$0]++' | tac > ~/.bash_history.new && mv ~/.bash_history.new ~/.bash_history
    

(presumindo que seu histórico de Bash está armazenado em ~/.bash_history , claro). Este comando remove as duplicatas enquanto respeita a ordem: os comandos usados pela última vez permanecem por último. Somente a última (mais recente) duplicata é mantida.

Com essa abordagem, consegui manter todo o meu histórico Bash em um tamanho de história muito modesto de 600 a 1000 entradas.

    
por 01.12.2015 / 11:17