¿Cómo evito que los comandos aparezcan en el historial de Bash?

93

A veces, cuando ejecuto comandos como rm -rf XYZ, no quiero que esto se registre en el historial de Bash, porque podría ejecutar accidentalmente el mismo comando nuevamente por reverse-i-search. ¿Existe una buena forma de evitar que esto suceda?

Jeeyoung Kim
fuente
serverfault.com/questions/48769/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Si bien bash se puede usar para escribir scripts de shell (por lo tanto, programación), este aspecto particular no tiene absolutamente nada que ver con la programación (la historia es una cosa interactiva solamente). Votación para cerrar.
paxdiablo
Relacionado: Ejecutar comando sin mantenerlo en la historia
Peter Mortensen

Respuestas:

110

Si ha establecido la HISTCONTROLvariable de entorno en ignoreboth(que generalmente se establece de manera predeterminada), los comandos con un carácter de espacio inicial no se almacenarán en el historial (así como los duplicados).

Por ejemplo:

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

Esto es lo que man bashdice:

HISTCONTROL

Una lista de valores separados por dos puntos que controla cómo se guardan los comandos en la lista del historial. Si la lista de valores incluye ignorespace, las líneas que comienzan con un carácter de espacio no se guardan en la lista del historial . Un valor de ignoredupshace que las líneas que coincidan con la entrada del historial anterior no se guarden. Un valor de ignorebothes una abreviatura de ignorespacey ignoredups. Un valor de erasedupshace que todas las líneas anteriores que coincidan con la línea actual se eliminen de la lista del historial antes de que se guarde esa línea. Se ignora cualquier valor que no esté en la lista anterior. Si no HISTCONTROLestá configurado o no incluye un valor válido, todas las líneas leídas por el analizador de shell se guardan en la lista del historial, sujeto al valor deHISTIGNORE. La segunda línea y las siguientes de un comando compuesto de varias líneas no se prueban y se agregan al historial independientemente del valor de HISTCONTROL.

Ver también:

Kenorb
fuente
51

En su .bashrc / .bash_profile / donde quiera, ponga export HISTIGNORE=' *'. Luego, comience cualquier comando que desee ignorar con un espacio.

$ ls  # goes in history
$  ls # does not
rhdoenges
fuente
4
Esto depende del valor de la HISTCONTROLvariable de entorno, que no necesariamente se ha ignorespaceestablecido.
Sorigal
3
Si HISTCONTROLcontiene ignorespace, en realidad solo es redundante incluir `*` en HISTIGNORE. Los dos operan de forma independiente.
chepner
22

Aún mejor uso HISTIGNORE. Esto le permite especificar un conjunto de patrones que se ignorarán (como rm). Es mejor (creo) que simplemente canalizar toda la historia /dev/null.

bmatheny
fuente
Ah sí, me olvidé de ese :)
Corey Henderson
13
kill -9 $$

Sé que no es tan mejor como las respuestas anteriores, pero esto matará el shell Bash actual sin guardar nada, útil cuando HISTCONTROL no está configurado de forma predeterminada, se olvidó de configurarlo, o simplemente se olvidó de poner un espacio inicial y acaba de escribir algunas contraseñas y no quiere que permanezcan permanentemente en el historial.

Esta es la forma más rápida, y algo como borrar el archivo de historial no es tan bueno porque necesita hacerlo fuera de un shell para guardar el historial (inicie sesión como un usuario diferente y use su / sudo, creando un trabajo en segundo plano, etc.)

El hechicero
fuente
8

Puedes hacer una de las dos cosas:

export HISTFILE=/dev/null

O comience el comando con un espacio.

Corey Henderson
fuente
5
un espacio antes que eso es increíble
Eric Fortis
8
Algunos de nosotros pensamos que ignorar automáticamente los comandos precedidos por un espacio es una muy mala idea y, por lo tanto, no se han ignorespaceconfigurado de forma predeterminada.
Sorigal
3
Establecer HISTFILEesta forma evita almacenar cualquier historial y no evita que el comando se agregue al historial en memoria.
chepner
3

O

unset HISTFILE

(similar a la respuesta anterior, pero más corta: export HISTFILE = / dev / null)

aledra
fuente
1
Esto solo afecta al historial en disco, no al historial en memoria.
chepner
2

Al iniciar el shell, limpio explícitamente el historial de las entradas que no quiero que estén allí. Por ejemplo, no quiero ninguno rm -rfen el historial (es un trauma después de eliminar un directorio lleno de resultados procesados ​​durante la noche, solo con un solo Arrow-Up+ Enter:)

Puse el siguiente fragmento en mi archivo de inicio (funciona con .zshrc, también debería funcionar con .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.
fuente