por que excluir o histórico do bash não é suficiente?

14

Eu achava que excluir meu histórico do bash era suficiente para limpar o meu histórico do bash, mas ontem meu gato estava mexendo no lado direito do teclado e, quando voltei para o computador, vi algo que digitei um mês atrás, e comecei a pressione todas as teclas como um louco procurando o que poderia ter causado isso. Acontece que a tecla UPARROW mostra meu histórico do bash, mesmo depois de excluir .bash_history.

Como posso excluir meu histórico do bash de verdade?

Bunden
fonte
8
.bash_history é substituído toda vez que você fecha um shell bash. Portanto, se você iniciar o bash, excluir .bash_history e fazer logoff, não terá conseguido exatamente nada.
Shadur 13/01/19
14
Seu gato merece uma enorme recompensa. Você usa o bash há quanto tempo sem descobrir que ele tem recuperação e edição de linha de comando? Você apenas redigita toda linha de comando do zero toda vez ou algo assim? Isso tornaria o shell muito desagradável de usar.
cas
@cas dez anos. Agora que você diz isso, eu pressiono Uparrow para repetir comandos, mas entendi como uma espécie de memória de 'curto prazo' com não mais do que algumas linhas. Não fui avisado de que excluir .bash_history não excluirá o histórico do bash.
Bunden
Excluindo ~/.bash_historyrealmente exclui ~/.bash_history.... mas (a menos que você tomar medidas para impedi-lo, como limpar o histórico na memória executando history -cum pouco antes de sair ou ajuste HISTFILE=/dev/nullou apenas unseting-lo) o bash irá apenas salvar sua história atual novamente quando ele sai . BTW, o HISTSIZEenv var informa ao bash quantas linhas do histórico manter na memória e HISTFILESIZEinforma ao bash o número máximo de linhas do histórico a serem salvas. ambos podem ser configurados, por exemplo, no seu ~/.bashrc. PS: o seu gato merece uma segunda recompensa para ensinar-lhe uma lição valiosa :)
cas
@cas Eu acho que excluir .bash_history deve excluir o histórico do bash. Parece intuitivo para mim. O que não parece intitivo é o histórico -c, o histórico -w, as variáveis ​​que não definem. Isso é louco da perspectiva da experiência do usuário.
Bunden

Respostas:

24

Em alguns casos (algumas versões do bash), fazendo um:

$ history -c; history -w

Ou simplesmente

$ history -cw

Limpará o histórico na memória (as setas para cima e para baixo não terão comandos para listar) e, em seguida, gravará isso no $HISTFILEarquivo (se $HISTFILEfor truncado pela instância do bash em execução).

Às vezes, o bash escolhe não truncar o $HISTFILEarquivo, mesmo com a histappendopção desabilitada e $HISFILEZIZEdefinida como 0.

Nesses casos, a opção nuke sempre funciona:

history -c; >$HISTFILE

Isso limpa a lista de histórico de comandos gravados na memória e todos os comandos previamente gravados em arquivo. Isso garantirá que o shell em execução não tenha histórico gravado na memória ou no disco; no entanto, outras instâncias em execução do bash (onde o histórico está ativo) podem ter uma cópia completa dos comandos lidos $HISTFILEquando o bash foi iniciado (ou quando a history -ré executado) .

Se também for necessário que nada mais (sem novos comandos) da presente sessão seja gravado no arquivo de histórico, unset HISTFILEimpedirá esse registro.

Isaac
fonte
1
A edição e execução de HISTFILE history -c && history -rsubstituiria seu histórico atual pelo histórico modificado manualmente. Em alguns casos, isso pode ser melhor do que jogar toda a história fora.
Mikko Rantalainen
9

bashtem um histórico de sessão na memória que é gravado no arquivo se a variável shell HISTFILEestiver definida como um nome de arquivo quando bashsair.

Se você excluir o arquivo apontado por HISTFILE, desmarque essa variável e saia bash, a sessão do shell não deixará nenhum histórico persistente.

Falha ao desarmar a HISTFILEvariável e excluir o arquivo apenas esvaziaria o histórico persistente, mas o histórico da sessão atual seria salvo quando o shell sair.

Kusalananda
fonte
3
UMA history -c; history -w limpará a memória e o histórico de arquivos. A desabilitação do HISTFILE será necessária apenas se nenhum comando adicional for registrado no histórico (não exatamente o que foi solicitado ao IMhO).
Isaac
-1

"Como posso excluir meu histórico do bash de verdade?"

Saia do bash, inicie um shell diferente, exclua o arquivo de histórico do bash.

ou

sair, faça login em uma conta diferente que tenha permissão de gravação no arquivo de histórico, exclua o arquivo de histórico.

do utilizador
fonte
-2

Ao sair da concha, faça tudo de uma vez, como

echo "" > ~/.bash_history && history -c && exit
user853069
fonte
@roaima, você está absolutamente certo, obrigado. Corrigido.
user853069