¿Cómo cierro una terminal sin guardar el historial?

33

Más de una vez accidentalmente ejecuté varios comandos y contaminé mi historial de bash. ¿Cómo cierro mi terminal sin guardar mi historial de bash? Estoy usando Fedora.

Michael Mrozek
fuente

Respuestas:

25

El historial de su shell se guarda en el archivo indicado por la HISTFILEvariable. Asi que:

unset HISTFILE

Esto también se aplica a zsh, pero no a ksh, que sigue guardando en el archivo indicado $HISTFILEcuando se inicia el shell (y, por el contrario, decide guardar su historial en ksh una vez que ha iniciado el shell).

Gilles 'SO- deja de ser malvado'
fuente
¿Puedo usar esto antes de cerrar sesión después de haber contaminado el historial? y es ust para esta sesión? no necesito la set HISTFILEpróxima vez que inicie sesión? (solo diga si esto es correcto o incorrecto)
@ acidzombie24 Eso es correcto, los cambios en las variables de entorno no se guardan en las sesiones a menos que almacene los cambios explícitamente, por ejemplo, en archivos rc.
jw013
31

Respuesta corta:

Escriba esto en el indicador:

$ kill -9 $$

Esto matará su shell de inmediato sin que el shell pueda hacer nada como atrapar la señal, guardar el historial, ejecutar ~/.bash_logout, advertir sobre trabajos detenidos o cualquiera de esas cosas buenas.

Respuesta larga:

Nota: Estas opciones no son mutuamente excluyentes; se pueden usar todos a la vez.

Opción 1:

Si eres un perfeccionista cuando se trata de abarrotar tu archivo de historial, entonces lo que puedes hacer es modificar la HISTIGNOREvariable para incluir globos de comandos que no deseas grabar. Por ejemplo, si agrega HISTIGNORE='ls*:cd*'a su ~/.bashrc, cualquier instancia de lsy cdno se inserta en su archivo de historial.

Opcion 2:

Si desea controlar comando por comando qué comandos quedan fuera de su historial, puede establecer HISTCONTROL='ignorespace'qué omitirá cualquier línea de comando que comience con un espacio. El uso ignorebothtambién omitirá líneas repetidas. Luego, presionar la barra espaciadora antes de ingresar un comando hará que no se muestre en su archivo de historial.

Opcion 3:

Si solo quiere que sea así, cuando cierre el terminal, el shell sale inmediatamente, puede trapindicar que el programa del terminal envía el shell ( xtermpor ejemplo, envía y SIGHUPluego espera a que el shell salga) y salga sin guardar el historial cuando recibe esta señal Agregue esto a su ~/.bashrc:

# don't record history when the window is closed
trap 'unset HISTFILE; exit' SIGHUP
anfetamaquina
fuente
2
+1 para el método 'kill -9 $$'. Esa es ciertamente una forma de evitar situaciones en las que HISTIGNORE, etc.están configuradas como de solo lectura.
Corey Henderson el
77
No creo que sea una buena idea promover el uso kill -9para cualquier cosa, excepto situaciones graves en las que todo lo demás ha fallado.
Christoffer Hammarström
1
Enviar SIGKILL nunca es una buena idea como procedimiento operativo estándar. Utilice los procedimientos adecuados, como desarmar HISTFILE.
Arcege
@Arcege TMTOWTDI.
anfetamáquinas
Quería saber lo contrario, por desgracia, cómo matar a bash asegurándome de que salvará su historia, y esto respondió mi pregunta, gracias.
mveroone
3

Me sorprende ver que nadie ha sugerido history -cinmediatamente antes exit. IINM (no soy un experto) que funcionará bien.

msh210
fuente
2
Estás en el camino correcto: history -rvolverá a leer el archivo del historial, por lo que guardar se convierte en un no-op.
Simon Richter
Vaciar el historial es un mal hábito ... el historial de shell contiene mucha información útil sobre quién hizo qué. es muy útil para las personas que son nuevas en sus plataformas (a menos que esté 100% seguro de su documentación, gestión de cambios)
Franklin Piat
2

Hay dos variables de entorno que bash usa para determinar el archivo de historial y cuántas líneas escribir cuando se cierra el shell.

Puede descartar el historial de su sesión con cualquiera de estos (establecidos durante la sesión que desea omitir de su archivo de historial):

HISTFILE=/dev/null

o

HISTSIZE=0

Cualquiera de estos funciona bien en Bash en Fedora

Eli Heady
fuente
1

No estoy seguro de por qué te importa tanto tu historial de comandos. Si necesita ciertos comandos con frecuencia, es posible que se divierta más si define alias para ellos, de modo que pueda recuperarlos con dos pulsaciones de teclas en lugar de tener que buscarlos en el historial.

Simon Richter
fuente
0
  1. Eli ya te dio la respuesta correcta para Bash, que es configurar HISTSIZE=0.

  2. Simplemente agregaría el método para hacerlo para la pantalla GNU . Presione Ctrl+A(secuencia de escape de la pantalla) seguido de :scrollback 0. Esto eliminará el historial de retroceso. Ahora puede hacer inmediatamente :scrollback 15000para restablecer el tamaño del búfer de desplazamiento hacia atrás.

gsbabil
fuente
¿Cuándo dijo el OP que estaban usando screen(1)?
anfetamáquina
El no lo hizo. Pero, podría estar ejecutando Bash dentro de una sesión de pantalla y HISTSIZE = 0 aún dejará los detalles de su actividad en el búfer de desplazamiento de la pantalla. Entonces, si realmente quieres que esté limpio, también debes hacerlo scrollback=0.
gsbabil
El búfer de desplazamiento hacia atrás se borra cuando se cierra la ventana (es decir, cuando se cierra el shell). ¿Qué pasa si escribiste Ctrl-a H? ¿Va a matar el archivo de registro?
anfetamáquinas
@amphetamachine: no, solo comenzará / finalizará el registro de la ventana actual. Neighther Ctrl+a Hni Ctrl+a :cleareliminará la historia. Es necesario Ctrl+a :scrollback 0. Puedes probarlo tú mismo. Comience una nueva sesión de pantalla. Ahora haz un cat /etc/passwd. Ahora, haga cualquiera de los anteriores - Ctrl+a Ho Ctrl+a :clear. Ahora, intente copiar desde el búfer de la pantalla con una flecha Ctrl+a [seguida de una flecha hacia arriba para ver qué tan lejos puede llegar a copiar. Si ha hecho un Ctrl+a :scrollbackseguido por un clear, solo iría tan lejos como puede ver en la ventana actual ya que no habrá ningún búfer de desplazamiento.
gsbabil