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

13

Eu emiti muitos comandos ontem 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 que emiti ontem, mas encontrei muitos comandos antigos alguns dias atrás. Por que os comandos recentes não foram armazenados? Como posso aumentar a capacidade do histórico?

    
por Jack 29.05.2016 / 19:42

4 respostas

7

A causa mais provável para os itens do histórico não aparecerem é definir HISTFILE como nada ou HISTSIZE como zero. É fazer login na mesma máquina duas vezes e sair com a segunda instância bash (na qual você fez pouco ou nada) depois daquele em que você fez muito. Por padrão, o Bash não mescla os históricos e o segundo Bash-exit sobrescreve o .bash_history que foi tão bem atualizado pela primeira saída do Bash.

Para evitar que isso aconteça, você pode acrescentar ao arquivo de histórico em vez de sobrescrever, você pode usar a opção histappend shell:

If the histappend shell option is enabled (see the description of shopt under SHELL BUILTIN COMMANDS below), the lines are appended to the history file, otherwise the history file is overwritten.

Mais detalhes em esta resposta incluindo como usar HISTSIZE , HISTFILESIZE e HISTCONTROL para tamanho de controle, duplicatas etc.

    
por 29.05.2016 / 20:40
4

Para modificar o tamanho do histórico, use duas variáveis BASH HISTSIZE , HISTFILESIZE (geralmente definido em .bashrc ).

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

HISTSIZE The number of commands to remember in the command history (see HISTORY below). If the value is 0, commands are not saved in the history list. Numeric values less than zero result in every command being saved on the history list (there is no limit). The shell sets the default value to 500 after reading any startup files.

HISTFILESIZE The maximum number of lines contained in the history file. When this variable is assigned a value, the history file is trun‐ cated, if necessary, to contain no more than that number of lines by removing the oldest entries. The history file is also truncated to this size after writing it when a shell exits. If the value is 0, the history file is truncated to zero size. Non-numeric values and numeric values less than zero inhibit truncation. The shell sets the default value to the value of HISTSIZE after reading any startup files.

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

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
    
por 29.05.2016 / 20:25
1

Eu tive isso, mas a solução não foi listada aqui. A causa foi apenas um problema simples 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.

A imagem acima foi o comando que eu tinha no meu formulário de clipboard google docs. Este comando foi executado mas foi omitido da minha história. Acabei de voltar e selecionei o comando sem espaço em branco e apareceu na história do bash.

    
por 10.11.2017 / 00:27
0

Verifique se a variável de ambiente HISTCONTROL não está definida como ignorespace ou ignoreboth .

$ echo $HISTCONTROL
ignoredups  #this is ok

Você pode modificá-lo definindo o valor no arquivo ~/.bash_profile ou ~/.profile :

HISTCONTROL=ignoredups

Da página de manual bash :

HISTCONTROL

A colon-separated list of values controlling how commands are saved on the history list.

If the list of values includes ignorespace, lines which begin with a space character are not saved in the history list.

A value of ignoredups causes lines matching the previous history entry to not be saved.

A value of ignoreboth is shorthand for ignorespace and ignoredups.

A value of erasedups causes all previous lines matching the current line to be removed from the history list before that line is saved.

Any value not in the above list is ignored.

If HISTCONTROL is unset, or does not include a valid value, all lines read by the shell parser are saved on the history list, subject to the value of HISTIGNORE. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTCONTROL.

    
por 29.11.2018 / 02:32