Como remover uma única linha do histórico?


Respostas:


340

Medidas preventivas

Se você deseja executar um comando sem salvá-lo no histórico, acrescente um espaço extra

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Para que isso funcione, você precisa ignorespaceou ignorebothentra HISTCONTROL. Por exemplo, execute

HISTCONTROL=ignorespace

Para tornar essa configuração persistente, coloque-a no seu .bashrc.

Limpeza post mortem

Se você já executou o comando e deseja removê-lo do histórico, use primeiro

history

para exibir a lista de comandos em seu histórico. Encontre o número ao lado do que você deseja excluir (por exemplo, 1234) e execute

history -d 1234

Além disso, se a linha que você deseja excluir já tiver sido gravada em seu $ HISTFILE (o que normalmente acontece quando você encerra uma sessão por padrão), será necessário escrever novamente em $ HISTFILE ou a linha reaparecerá quando você abrir um novo sessão:

history -w

Funcionou. Eu acho que precisamos usar o ~ / .bashrc depois de modificá-lo ...
B Seven

3
@ jw013 Defino PROMPT_COMMAND como history -a, nesse caso, já está gravado no arquivo de histórico, em vez de sair na configuração normal. Especificamente: mywiki.wooledge.org/BashFAQ/088
jordanm 22/10/12

5
Após excluir uma única linha, você precisa escrever o histórico atual no seu $ HISTFILE usando history -w. Caso contrário, quando você sair, a linha excluída ainda estará lá!
Felipe Alvarez

1
+1 ao comentário acima; usar history -wafter history -d {num}era exatamente o que eu precisava - que petiscos críticos deveriam ser adicionados à resposta, caso contrário, um usuário pode pensar que uma exclusão temporária do shell atual é realmente permanente.
11136 Michael

1
O @BobStein history -wé necessário para entradas que já foram gravadas no .bash_historyarquivo. Como reproduzir (por exemplo, no CentOS 7 com configuração de estoque): 1. logon 2. comando enter echo foo3. logout 4. logon novamente 5. excluir entrada para echo foo6. logout 7. logon 7. logon novamente: a entrada ainda está lá. Dependendo de como você configura seu histórico do bash, talvez você possa reproduzir esse problema de outras maneiras - ou seja, se você provocar a gravação do histórico antes do logout.
maxschlepzig

53
  1. Para limpar todo o seu histórico, use

    history -c
  2. Para excluir uma única linha, use

    history -d linenumber

6

Eu tenho isso no meu ~/.bashrc, o que faz com que o comando $ forgetexclua o comando anterior do histórico

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}

Isso parece um pouco complicado. Não history -d $( history | tail -n 1 | cut -f 1 -d " " )seria mais simples?
Seumasmac

1
history | tail -n1é o historypróprio comando, portanto, a exclusão desse número obtém a entrada errada. No entanto, history -d $( history | awk 'END{print $1-1}' )combina a seleção de linha, seleção de campo e subtração.
dave_thompson_085

Alguma chance de alguém ajudar com portin isso para zshell?
Alex S

6

Você sempre pode editar e remover entradas de ~/.bash_history, útil quando desejar remover uma entrada ou mais de uma entrada


2
Muito provavelmente, essas entradas serão reintroduzidas quando você sair do shell.
L0b0 17/07/2018

5

Se você deseja esquecer toda a sessão do bash, pode killexecutar o processo atual do bash. Como a variável $$mantém o pidshell atual, você pode:

kill -9 $$

1

Você precisa escrever as alterações depois de limpar o histórico. E se você não gostaria de ter o comando wipe no histórico, é necessário executar o comando assim:

history -c && history -w && logout

Boa sorte.


-1
Adding another point suppose if you want to delete a range of history lines

You can use below script. 

Below example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.