Quanto tempo dura o conteúdo do arquivo .bash_history?

11

Como posso modificar o conteúdo do meu bash_historyarquivo? Quais valores ou variáveis ​​controlam quanto tempo dura o histórico? Há outras coisas que eu possa mudar para fornecer um controle mais refinado do meu histórico do BASH?

nbro
fonte
2
Não acredito que esse arquivo seja controlado pelo período de tempo, mas pelo tamanho final do arquivo. Veja aqui: Existe uma maneira de definir o tamanho da lista do histórico no bash para mais de 5000 linhas? . Então o env. variáveis HISTSIZEe HISTFILESIZEsão as únicas superfícies de controle que você precisa controlar quanto histórico é mantido.
slm

Respostas:

12

Existem duas variáveis ​​que controlam o tamanho do histórico:

HISTFILESIZE O número máximo de linhas contidas no arquivo de histórico. Quando essa variável recebe um valor, o arquivo de histórico é truncado, se necessário, para conter não mais que esse número de linhas, removendo as entradas mais antigas. O arquivo de histórico também é truncado para esse tamanho depois de gravado quando um shell sai. Se o valor for 0, o arquivo de histórico será truncado para o tamanho zero. Valores não numéricos e valores numéricos menores que zero inibem o truncamento. O shell define o valor padrão como HISTSIZE depois de ler qualquer arquivo de inicialização.

e

HISTSIZE O número de comandos a serem lembrados no histórico de comandos (consulte HISTORY abaixo). Se o valor for 0, os comandos não serão salvos na lista de histórico. Valores numéricos menores que zero resultam em todos os comandos salvos na lista de histórico (não há limite). O shell define o valor padrão para 500 depois de ler qualquer arquivo de inicialização.

Essas duas variáveis ​​permitem controlar o comportamento do seu histórico. Basicamente, HISTSIZEé o número de comandos salvos durante a sessão atual e HISTFILESIZEo número de comandos que serão lembrados nas sessões. Então, por exemplo:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

No exemplo acima, como HISTSIZEé definido como 10, historyretorna uma lista de 10 comandos. No entanto, se você efetuar logoff e logon novamente, historyretornará apenas 5 comandos porque HISTFILESIZEestá definido como 5. Isso ocorre porque, quando você sai da sessão, suas HISTFILESIZElinhas do seu histórico são salvas no seu arquivo de histórico ( ~/.bash_historypor padrão, mas controlado por HISTFILE) Em outras palavras, os comandos são adicionados HISTFILEaté que cheguem $HISTFILESIZEàs linhas em que ponto, cada linha subsequente adicionada significa que o primeiro comando do arquivo será removido.

Você pode definir os valores dessas variáveis ​​no seu ~/.profile(ou ~/.bash_profilese esse arquivo existir). Não defina-os ~/.bashrcprimeiro, porque eles não têm negócios definidos e, em segundo lugar, porque isso faria com que você tivesse um comportamento diferente nos shells de login versus não-login, o que pode levar a outros problemas .

Outras variáveis ​​úteis que permitem ajustar o comportamento do seu histórico são:

  • HISTIGNORE: Isso permite que você ignore determinados comandos comuns que raramente são de interesse. Por exemplo, você pode definir:

    export HISTIGNORE="pwd:df:du"

    Isso faria com que qualquer comando que comece com pwd, dfou duseja ignorado e não seja salvo no seu histórico.

  • HISTCONTROL: Este permite que você escolha como o histórico funciona. Pessoalmente, eu o defino para HISTCONTROL=ignoredupsque ele salve comandos duplicados apenas uma vez. Outras opções são ignorespaceignorar comandos iniciados com espaço em branco e erasedupsque fazem com que todas as linhas anteriores correspondentes à linha atual sejam removidas da lista de histórico antes que a linha seja salva. ignorebothé uma abreviação de ignorespace e ignoredups.

  • HISTTIMEFORMAT: Permite definir o formato da hora do arquivo de histórico. Veja a resposta de Pandya ou leia man bashpara detalhes.


Para um ajuste fino adicional, você tem:

  • A histappendopção do bash. Isso pode ser definido executando shopt -s histappendou adicionando esse comando ao seu ~/.bashrc. Se esta opção estiver configurada

    a lista de histórico é anexada ao arquivo nomeado pelo valor da variável HISTFILE quando o shell sai, em vez de sobrescrever o arquivo.

    Isso é muito útil, pois permite combinar o histórico de diferentes sessões (pense em diferentes terminais, por exemplo).

  • O historycomando possui duas opções úteis:

    • history -a : faz com que o último comando seja gravado no arquivo de histórico automaticamente

    • history -r : importa o arquivo de histórico para a sessão atual.

    Você pode, por exemplo, adicionar esses dois comandos ao seu PROMPT_COMMAND(que é executado toda vez que seu shell mostra o prompt, portanto, sempre que você inicia um novo shell e depois de cada comando, é executado):

    export PROMPT_COMMAND='history -a;history -r;'

    Combinados, eles garantem que qualquer novo terminal aberto importe imediatamente o histórico de quaisquer outras sessões do shell. O resultado é um histórico comum em todos os terminais / sessões de shell.

terdon
fonte
2

O tamanho padrão do arquivo de histórico é de 500 linhas. Quando o arquivo .bash_history atinge 500 linhas, as entradas iniciais são eliminadas para abrir espaço para as linhas mais recentes, como no FIFO. Você pode alterar isso alterando o valor da variável HISTFILESIZEque, por padrão, tem o valor 500.

Colocar um HISTFILESIZE=10000em seu .bashrc aumentará o número de linhas que o arquivo de histórico pode conter para 10000, aumentando assim a vida útil de seu conteúdo.

Sree
fonte
2
nota: se você aumentar HISTSIZEo limite, considere mudar HISTFILEtambém. Se você executar bash --norc HISTSIZE, voltará ao valor padrão, truncando sua HISTFILEsaída.
llua
Obrigado, @llua. Da mesma forma, se o seu sistema /etc/bash.bashrcdefine um HISTFILESIZE(ou talvez HISTSIZE; eu não verifiquei qual), o Bash parece truncar .bash_historyno ponto em que lê /etc/bash.bashrc(ou pelo menos em algum momento antes de seu novo limite ser definido em seus próprios arquivos de inicialização do Bash). Para evitar isso, novamente, defina o seu próprio HISTFILEpara que seu histórico real chegue lá e não no .bash_historyarquivo que o Bash está truncando.
22420 Chris Povirk #
(Mas não export, como isso iria torná-lo visível para qualquer criança conchas, que poderia, então, olhar para truncar-lo em vez de .bash_history!)
Chris Povirk
0

Leia man bashpara obter mais detalhes sobre o histórico do bash, como:

HISTCONTROL
       Uma lista de valores separados por dois pontos que controla como os comandos são salvos na lista de histórico.
       Se a lista de valores incluir ignorespace, as linhas que começam com um caractere de espaço são
       não salvo na lista de histórico. Um valor de ignoredups faz com que as linhas correspondam às anteriores
       entrada do histórico para não ser salva. Um valor de ignoreboth é uma abreviação de ignorespace e
       ignoredups. Um valor de apagados remove todas as linhas anteriores correspondentes à linha atual para
       ser removido da lista de histórico antes que essa linha seja salva. Qualquer valor que não esteja acima
       lista é ignorada. Se HISTCONTROL estiver desabilitado ou não incluir um valor válido, todas as linhas
       lidas pelo analisador de shell são salvas na lista de histórico, sujeitas ao valor de HISTIG‐
       NORE. As segundas e subsequentes linhas de um comando composto de várias linhas não são testadas,
       e são adicionados ao histórico, independentemente do valor de HISTCONTROL.
HISTFILE
       O nome do arquivo no qual o histórico de comandos é salvo (consulte HISTÓRICO abaixo). O padrão
       o valor é ~ / .bash_history. Se não estiver definido, o histórico do comando não será salvo quando um shell sair.
HISTFILESIZE
       O número máximo de linhas contidas no arquivo de histórico. Quando esta variável é atribuída
       um valor, o arquivo de histórico é truncado, se necessário, para conter não mais que esse número
       de linhas removendo as entradas mais antigas. O arquivo de histórico também é truncado para esse tamanho
       depois de escrever quando um shell sai. Se o valor for 0, o arquivo de histórico será truncado para
       tamanho zero. Valores não numéricos e valores numéricos menores que zero inibem o truncamento. o
       shell define o valor padrão para o valor de HISTSIZE depois de ler qualquer arquivo de inicialização.
HISTIGNORE
       Uma lista de padrões separados por dois pontos usada para decidir quais linhas de comando devem ser salvas no
       a lista do histórico. Cada padrão é ancorado no início da linha e deve corresponder
       a linha completa (nenhum `* 'implícito é anexado). Cada padrão é testado contra a linha
       após as verificações especificadas por HISTCONTROL serem aplicadas. Além da concha normal
       caracteres correspondentes a padrão, `& 'corresponde à linha do histórico anterior. `& 'pode ser escapado
       usando uma barra invertida; a barra invertida é removida antes de tentar uma correspondência. O segundo e
       as linhas subsequentes de um comando composto de várias linhas não são testadas e são adicionadas ao
       história independentemente do valor de HISTIGNORE.
HISTSIZE
       O número de comandos a serem lembrados no histórico de comandos (consulte HISTORY abaixo). Se o
       o valor é 0, os comandos não são salvos na lista de histórico. Valores numéricos menores que zero
       resulta em todos os comandos sendo salvos na lista de histórico (não há limite). A concha
       define o valor padrão para 500 depois de ler qualquer arquivo de inicialização.
HISTTIMEFORMAT
       Se essa variável for configurada e não nula, seu valor será usado como uma sequência de formato para strftime (3)
       para imprimir o carimbo de hora associado a cada entrada do histórico exibida pelo histórico
       construídas em. Se essa variável estiver definida, os carimbos de hora serão gravados no arquivo de histórico para que possam
       ser preservado nas sessões de shell. Isso usa o caractere de comentário do histórico para distinguir
       timestamps de outras linhas da história.

Particularmente HISTFILESIZEe HISTSIZEque você esteja procurando e o ajude.

Pandya
fonte