¿Suspender temporalmente bash_history en un shell determinado?

116

¿Hay alguna manera de suspender temporalmente el seguimiento del historial en bash, para ingresar en una especie de modo "incógnito"? Estoy ingresando cosas en mi terminal que no quiero que se registre, información financiera confidencial.

Naftuli Kay
fuente

Respuestas:

153

Esto debería ser lo que estás buscando:

unset HISTFILE

De man bash

Si HISTFILE no está configurado, o si el archivo de historial no se puede escribir, el historial no se guarda.

Alternativamente, si desea desactivarlo y luego volver a activarlo, puede ser más fácil de usar set:

Apagar

set +o history

Encender

set -o history
SiegeX
fuente
12
El valor de HISTFILEsolo se verifica cuando bash sale, por lo que el primer método no funciona como está (si restaura el valor, se guardará el comando). set +o historyfunciona según lo indicado.
Gilles
66
Gracias excelente. Voy a usar set +o historyy set -o historypara alternar cuando estoy haciendo cosas secretas;)
Naftuli Kay
1
unset HISTFILENo funciona. set -/+o history¡Funciona de maravilla! gracias
kholofelo Maloma
44
Como sugerencia, si coloca un espacio antes del comando (comience el comando con un espacio), no se registrará en su historial, y las teclas de flecha arriba / abajo tampoco lo mostrarán.
Mahdi
1
Esto no funcionará en zsh por cierto
Shubham Chaudhary
33

Usando bash, establece HISTCONTROL="ignorespace"y precede con espacio cualquier comando que no desees que se registre en el historial. En caso de que haya olvidado tomar alguna medida, también existe history -d <number>para eliminar una entrada específica o history -cpara borrar todo el historial de comandos.

forcefsck
fuente
27

Asegúrese de que HISTCONTROLcontiene ignorespace. Probablemente quieras agregar HISTCONTROL=ignorespace( HISTCONTROL=ignoredups:ignorespaceo algo) a tu ~/.bashrc. Entonces, cualquier línea de comando que comience con un espacio se omite del historial.

Otra posibilidad es comenzar una nueva sesión de bash que no guarde su historial.

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

Si necesita evitar almacenar varios comandos y aún desea usar la flecha hacia arriba para acceder a comandos anteriores, use:

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

Hay cuatro formas (niveles) para controlar cómo se almacenan los comandos.

  1. El primero y más simple es usar ignorespace(o ignorarlos):

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

    Eso permitirá usar un espacio antes de los comandos que desea evitar que se graben en la lista de memoria history. Y, en consecuencia, como no hay ningún comando grabado en la memoria que pueda enviarse a un archivo, también evitará que se envíe un comando al archivo que figura en la lista $HISFILE.

  2. Evite grabar comandos en el archivo en $HISTFILE:

    $ unset HISTFILE

    Si no está configurado, el historial de comandos no se guarda cuando sale un shell.

    Nulo HISTFILE=''y / o configurado para HISTFILE=/dev/nullfuncionar con el mismo efecto. Comprenda que los comandos aún se están grabando en la lista de memoria, pruebe el historycomando o la flecha hacia arriba.

    Advertencia: si HISTFILE se restablece antes de que exista el shell, todo lo que se ha grabado en la memoria podría escribirse en el archivo de todos modos.

  3. Evite grabar nuevos comandos en la lista del historial en la memoria. Y, como no está en la memoria, no se puede grabar en un archivo.

    $ shopt -ou history              # or set +o history

    Vuelva a habilitar con shopt -os history(o set -o history)

  4. Elimine todos los comandos de la lista de historial en la memoria:

    $ HISTSIZE=0

    Todos los comandos se borran (de la memoria) y, por lo tanto, no se puede almacenar nada en el archivo, por supuesto, hasta que la variable se establezca nuevamente en algún valor numérico válido.

Isaac
fuente
//, Esto cubre todas las respuestas excepto la respuesta de @Ambrose en una página conveniente. Así se hace, @ Isaac. ¿Estaría dispuesto a agregar un enlace o dos a los documentos para esto? Bastante seguro de man historyque no será suficiente para la mayoría de nosotros.
Nathan Basanese
1
@NathanBasanese expandido. ¿Mejor?
Isaac
// , ¡Si! ¿Sería correcto al suponer que estos provienen de las variables Bash y los documentos integrados de Shopt ?
Nathan Basanese
//, también, mientras estaba leyendo la documentación variables Bash , me encontré con HISTIGNOREque subsumesla función de HISTCONTROL.
Nathan Basanese
(Suponiendo que está utilizando Linux): ¿Qué sucede si ejecuta el comando LESS=+'/^ *HISTI' man bash(¿no son las "páginas del manual"?). @NathanBasanese
Isaac
3

Hay una forma sencilla de desactivar el historial, por lo que los comandos no se almacenarán en el .bash_historyarchivo.

Debe colocar el espacio en blanco o el espacio de tabulación delante de cualquier comando, para que ese comando no se almacene en el historial. Por ejemplo:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

El pwdcomando no se almacenará en el historial porque tiene espacios en blanco en el frente.

Kalanidhi M.
fuente
Esto no funciona; Bash se queja de que '-' o '-historia', u otros comandos con guiones no se pueden encontrar.
Samuel A. Falvo II
2
Esto no funcionará a menos que HISTCONTROL = "ignorespace" esté configurado como en la respuesta de forcefsck
DeveloperChris
1
export HISTFILE=/dev/null 

Esa es mi manera de ir a Goto. En caso de que el HISTORY / HISTFILE / HISTCONTROL no configurado no funcione, exportarlo a / dev / null siempre me ha funcionado.

Ambrosio
fuente
¿Por suspender temporalmente la historia? Esto no funcionó para mí como un comando regular. Los comandos posteriores se registraron en el historial. ¿Está llamando a esto en .bash_profile o un script? GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Mat Gessel