Às vezes, os comandos de histórico não são armazenados em .bash_history

20

Ontem emiti muitos comandos no meu CentOS 7. Mas quando eu queria recuperar esses comandos hoje, descobri que não havia nenhum registro. Quando abri o arquivo .bash_history, ainda não consegui encontrar os comandos emitidos ontem, mas encontrei muitos comandos antigos há alguns dias. Por que os comandos recentes não foram armazenados? Como posso aumentar a capacidade do histórico?

Jack
fonte
Às vezes, quando o terminal está fechado de forma anormal, a história não é salvo, isso aconteceu comigo também, mas eu não sei as circunstâncias que estão causando esse comportamento
mazs

Respostas:

11

A causa mais provável para os itens do histórico não aparecerem é não definir HISTFILEnada ou HISTSIZEzero, é fazer login na mesma máquina duas vezes e sair com a segunda instância do bash (na qual você fez pouco ou nada) depois daquela em que você fez muito. Por padrão, o Bash não mescla históricos e a segunda saída do Bash substitui a .bash_historyque foi tão bem atualizada pela primeira saída do Bash.

Para impedir que isso aconteça, você pode anexar ao arquivo de histórico em vez de substituir, você pode usar a histappendopção shell:

Se a opção shell histappend estiver ativada (consulte a descrição do shopt em SHELL BUILTIN COMMANDS abaixo), as linhas serão anexadas ao arquivo de histórico, caso contrário, o arquivo de histórico será substituído.

Mais detalhes em esta resposta , incluindo como usar HISTSIZE, HISTFILESIZEe HISTCONTROLpara controlar o tamanho, duplicatas etc.

Anthon
fonte
3

Para modificar histórico de uso tamanho duas variáveis de bash HISTSIZE, HISTFILESIZE(geralmente definidas em .bashrc).

Descrição da página de manual do BASH:

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.

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.

Como exemplo, tenho a seguinte configuração no meu .bashrcarquivo:

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

Isso aconteceu, mas a solução não estava listada aqui. A causa foi apenas um simples problema de copiar e colar. Eu estava copiando um comando de outro documento e tinha algum espaço em branco extra na área de transferência. Por alguma razão, isso fez com que o Ubuntu não salvasse o comando no arquivo de histórico.

insira a descrição da imagem aqui

A imagem acima foi o comando que eu tinha no meu formulário de transferência do google docs. Este comando foi executado, mas foi omitido do meu histórico. Acabei de voltar e selecionei o comando sem espaços em branco e, em seguida, ele apareceu no histórico do bash.

Tycon
fonte
5
Uma das opções do histórico é ignorar (não salvar) as linhas que começam com um espaço. Geralmente, o padrão é ativado. Isso pode ser alterado no seu .bashrc.
Studog
1

Verifique se sua HISTCONTROLvariável de ambiente não está definida como ignorespaceou ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Você pode modificá-lo definindo o valor no seu ~/.bash_profileou no seu ~/.profilearquivo:

HISTCONTROL=ignoredups

Na bashpágina do manual:

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 não são salvas na lista de histórico.

Um valor de ignoredupsfaz com que as linhas correspondentes à entrada do histórico anterior não sejam salvas.

Um valor de ignorebothé uma abreviação de ignorespacee ignoredups.

Um valor erasedupsfaz com que todas as linhas anteriores correspondentes à linha atual sejam removidas da lista de histórico antes que essa linha seja salva.

Qualquer valor que não esteja na lista acima é ignorado.

Se HISTCONTROL não estiver definido ou não incluir um valor válido, todas as linhas lidas pelo analisador de shell serão salvas na lista de histórico, sujeitas ao valor de HISTIGNORE. A segunda linha e as linhas subseqüentes de um comando composto de várias linhas não são testadas e são adicionadas ao histórico, independentemente do valor de HISTCONTROL.

gawi
fonte