Suspender temporariamente o bash_history em um determinado shell?

115

Existe uma maneira de suspender temporariamente o rastreamento de histórico no bash, para entrar em uma espécie de modo "anônimo"? Estou inserindo coisas no meu terminal que não quero informações financeiras confidenciais registradas.

Naftuli Kay
fonte

Respostas:

153

Deve ser o que você está procurando:

unset HISTFILE

De man bash

Se HISTFILE estiver desabilitado ou se o arquivo do histórico for gravável, o histórico não será salvo.

Como alternativa, se você deseja desativá-lo e ligá-lo novamente, pode ser mais fácil usar set:

Desligar

set +o history

Ligar

set -o history
SiegeX
fonte
12
O valor de HISTFILEsó é verificado quando o bash é encerrado, portanto, o primeiro método não funciona como está (se você restaurar o valor, o comando será salvo). set +o historyfunciona como indicado.
Gilles
5
Obrigado, excelente. Vou usar set +o historye set -o historypara alternar frente e para trás quando eu estou fazendo coisas secretas;)
Naftuli Kay
1
unset HISTFILEnão funciona. set -/+o historyFunciona como um encanto! graças
kholofelo Maloma
4
Como dica, se você colocar um espaço antes do comando (inicie o comando com um espaço), ele não será gravado no seu histórico e as teclas de seta para cima / para baixo também não serão exibidas.
Mahdi
1
Isso não vai funcionar em zsh btw
Shubham Chaudhary
33

Usando o bash, defina HISTCONTROL="ignorespace"e anteceda com espaço qualquer comando que você não deseja que seja gravado no histórico. Caso você tenha esquecido de tomar alguma medida, também há history -d <number>para excluir uma entrada específica ou history -climpar todo o histórico de comandos.

forcefsck
fonte
27

Certifique-se de que HISTCONTROLcontém ignorespace. Você provavelmente desejará adicionar HISTCONTROL=ignorespace( HISTCONTROL=ignoredups:ignorespaceou algo assim) ao seu ~/.bashrc. Em seguida, qualquer linha de comando que comece com um espaço é omitida do histórico.

Outra possibilidade é iniciar uma nova sessão do bash que não salve seu histórico.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent shell
Gilles
fonte
5

Se você precisar evitar o armazenamento de vários comandos e ainda quiser usar a seta para cima para acessar os comandos anteriores, use:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

Existem quatro maneiras (níveis) de controlar como os comandos são armazenados.

  1. A primeira e mais simples é usar ignorespace(ou ignorar):

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"

    Isso permitirá usar um espaço antes dos comandos que você deseja evitar serem gravados na lista de memórias de history. E, consequentemente, como não há nenhum comando gravado na memória que possa ser enviado ao arquivo, também evitará que um comando seja enviado ao arquivo listado em $HISFILE.

  2. Evite gravar comandos no arquivo em $HISTFILE:

    $ unset HISTFILE

    Se não estiver definido, o histórico do comando não será salvo quando um shell sair.

    Nulo HISTFILE=''e / ou definido para HISTFILE=/dev/nullfunciona com o mesmo efeito. Entenda que os comandos ainda estão sendo gravados na lista de memórias, tente o historycomando ou a seta para cima.

    Aviso: se HISTFILE for redefinido antes que o shell exista, tudo o que foi gravado na memória poderá ser gravado no arquivo de qualquer maneira.

  3. Evite gravar novos comandos na lista de histórico na memória. E, como não está na memória, não pode ser gravado em arquivo.

    $ shopt -ou history              # or set +o history

    Reativar com shopt -os history(ou set -o history)

  4. Remova todos os comandos da lista de histórico na memória:

    $ HISTSIZE=0

    Todos os comandos são apagados (da memória) e, portanto, nada pode ser armazenado no arquivo, é claro, até que a variável seja configurada novamente com algum valor numérico válido.

Isaac
fonte
//, abrange todas as respostas, exceto a resposta de @Ambrose, em uma página conveniente. Muito bem, @Isaac. Você gostaria de adicionar um ou dois links aos documentos para isso? Certamente man historynão será suficiente para a maioria de nós.
22618 Nathan Basanese
1
@NathanBasanese Expanded. Melhor?
21318 Isaac
// , Sim! Eu estaria correto ao presumir que eles vêm dos documentos Bash Variables e Shopt Built ?
21718 Nathan Basanese
//, Além disso, enquanto eu estava lendo a documentação Variáveis Bash , me deparei HISTIGNORE, que subsumesa função de HISTCONTROL.
21918 Nathan Basanese
(Supondo que você esteja usando o Linux): O que acontece se você executar o comando LESS=+'/^ *HISTI' man bash(não são as "páginas de manual"?). @NathanBasanese
Isaac
3

Há uma maneira simples de desativar o histórico, para que os comandos não sejam armazenados no .bash_historyarquivo.

Você deve colocar o espaço em branco ou espaço de tabulação na frente de qualquer comando, para que o comando não seja armazenado no histórico. Por exemplo:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

O pwdcomando não será armazenado no histórico, porque possui um espaço em branco na frente.

Kalanidhi M.
fonte
Isso não funciona; Bash reclama que '-' ou '-history' ou outros comandos hifenizados não podem ser encontrados.
Samuel A. Falvo II
2
Isso não funcionará, a menos que HISTCONTROL = "ignorespace" seja definido como na resposta do forcefsck
DeveloperChris
1
export HISTFILE=/dev/null 

Esse é o meu caminho. Caso o HISTORY / HISTFILE / HISTCONTROL, etc ... não funcione, exportá-lo para / dev / null sempre funcionou para mim.

Ambrose
fonte
Para suspender temporariamente o histórico? Isso não funcionou para mim como um comando regular. Os comandos subsequentes foram registrados no histórico. Você está chamando isso em .bash_profile ou em um script? GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Mat Gessel 03/03