Como evito que comandos apareçam no histórico do Bash?

93

Às vezes, quando executo comandos como rm -rf XYZ, não quero que isso seja registrado no histórico do Bash, porque posso acidentalmente executar o mesmo comando novamente por reverse-i-search. Existe uma boa maneira de evitar que isso aconteça?

Jeeyoung Kim
fonte
serverfault.com/questions/48769/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Embora bash possa ser usado para escrever scripts de shell (portanto, programação), este aspecto particular não tem absolutamente nada a ver com programação (a história é uma coisa interativa apenas). Votando para fechar.
paxdiablo
Relacionado: Executar comando sem mantê-lo no histórico
Peter Mortensen

Respostas:

110

Se você definiu a HISTCONTROLvariável de ambiente para ignoreboth(que geralmente é definida por padrão), os comandos com um caractere de espaço não serão armazenados no histórico (assim como duplicatas).

Por exemplo:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

Aqui está o que man bashdiz:

HISTCONTROL

Uma lista de valores separados por dois pontos controlando 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 anterior do histórico não sejam salvas. Um valor de ignorebothé uma abreviação de ignorespacee ignoredups. Um valor de erasedupsfaz com que todas as linhas anteriores que correspondem à 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 HISTCONTROLnão estiver definido ou não incluir um valor válido, todas as linhas lidas pelo analisador de shell são salvas na lista de histórico, sujeito ao valor deHISTIGNORE. A segunda linha e as subsequentes 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.

Veja também:

Kenorb
fonte
51

Em seu .bashrc / .bash_profile / onde você quiser, coloque export HISTIGNORE=' *'. Em seguida, basta iniciar qualquer comando que deseja ignorar com um espaço.

$ ls  # goes in history
$  ls # does not
Rhdoenges
fonte
4
Isso depende do valor da HISTCONTROLvariável de ambiente, que não necessariamente tem ignorespacedefinido.
sorpigal
3
Se HISTCONTROLcontiver ignorespace, na verdade é apenas redundante incluir `*` em HISTIGNORE. Os dois operam de forma independente.
chepner de
22

Uso ainda melhor HISTIGNORE. Isso permite que você especifique um conjunto de padrões a serem ignorados (como rm). É melhor (eu acho) do que apenas enviar toda a história para /dev/null.

bmatheny
fonte
Ah sim, esqueci disso :)
Corey Henderson
13
kill -9 $$

Eu sei que não é tão melhor quanto as respostas anteriores, mas isso vai matar o shell Bash atual sem salvar nada, útil quando HISTCONTROL não está configurado por padrão, você se esqueceu de configurá-lo, ou puro e simples você esqueceu de colocar um espaço inicial e você acabou de digitar algumas senhas e não quer que elas permaneçam permanentemente no histórico.

Esta é a maneira mais rápida, e algo como apagar o arquivo de histórico não é tão bom porque você precisa fazer isso fora de um shell de salvamento de histórico (faça login como um usuário diferente e use su / sudo, criando um trabalho em segundo plano, etc.)

O feiticeiro
fonte
8

Você pode fazer uma das duas coisas:

export HISTFILE=/dev/null

Ou comece o comando com um espaço.

Corey Henderson
fonte
5
um espaço antes disso é incrível
Eric Fortis
8
Alguns de nós pensam que ignorar automaticamente os comandos prefixados por um espaço é uma ideia realmente ruim e, portanto, não os ignorespacedefiniu por padrão.
sorpigal
3
Definir HISTFILEdessa forma evita o armazenamento de qualquer histórico e não impede que o comando seja adicionado ao histórico na memória.
chepner de
3

Ou

unset HISTFILE

(semelhante à resposta anterior, apenas mais curta: export HISTFILE = / dev / null)

aledra
fonte
1
Isso afeta apenas o histórico do disco, não o histórico da memória.
chepner de
2

Na inicialização do shell, eu limpo explicitamente o histórico das entradas que não quero que estejam lá. Por exemplo, não quero nenhum rm -rfno histórico (é um trauma após a remoção de um diretório cheio de resultados processados ​​durante a noite, apenas com um único Arrow-Up+ Enter:)

Eu coloquei o seguinte trecho no meu arquivo init (funciona com .zshrc, também deve funcionar com .bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
Jakub M.
fonte