Comment empêcher les commandes de s'afficher dans l'historique de Bash?

93

Parfois, lorsque j'exécute des commandes comme rm -rf XYZ, je ne veux pas que cela soit enregistré dans l'historique de Bash, car je pourrais accidentellement exécuter à nouveau la même commande par reverse-i-search. Y a-t-il un bon moyen d'éviter que cela ne se produise?

Jeeyoung Kim
la source
serverfault.com/questions/48769/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Bien qu'il bash puisse être utilisé pour écrire des scripts shell (d'où la programmation), cet aspect particulier n'a absolument rien à voir avec la programmation (l'histoire est une chose uniquement interactive). Vote de clôture.
paxdiablo

Réponses:

110

Si vous avez défini la HISTCONTROLvariable d'environnement sur ignoreboth(qui est généralement définie par défaut), les commandes avec un espace au début ne seront pas stockées dans l'historique (ainsi que les doublons).

Par exemple:

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

Voici ce que man bashdit:

HISTCONTROL

Une liste de valeurs séparées par deux-points contrôlant la manière dont les commandes sont enregistrées dans la liste d'historique. Si la liste de valeurs comprend ignorespace, les lignes commençant par un espace ne sont pas enregistrées dans la liste d'historique . Une valeur de ignoredupsfait que les lignes correspondant à l'entrée d'historique précédente ne sont pas enregistrées. Une valeur de ignorebothest un raccourci pour ignorespaceet ignoredups. Une valeur de erasedupsentraîne la suppression de toutes les lignes précédentes correspondant à la ligne actuelle de la liste d'historique avant que cette ligne ne soit enregistrée. Toute valeur ne figurant pas dans la liste ci-dessus est ignorée. Si HISTCONTROLn'est pas défini, ou n'inclut pas de valeur valide, toutes les lignes lues par l'analyseur du shell sont enregistrées dans la liste d'historique, sous réserve de la valeur deHISTIGNORE. La deuxième ligne et les suivantes d'une commande composée multiligne ne sont pas testées et sont ajoutées à l'historique quelle que soit la valeur de HISTCONTROL.

Voir également:

Kenorb
la source
51

Dans votre .bashrc / .bash_profile / où vous voulez, mettez export HISTIGNORE=' *'. Ensuite, commencez simplement toute commande que vous souhaitez ignorer avec un espace.

$ ls  # goes in history
$  ls # does not
rhdoenges
la source
4
Cela dépend de la valeur de la HISTCONTROLvariable d'environnement, qui n'a pas nécessairement ignorespacedéfini.
sorpigal
3
Si HISTCONTROLcontient ignorespace, il n'est en fait redondant que d'inclure «*» dans HISTIGNORE. Les deux fonctionnent indépendamment.
chepner
22

Une utilisation encore meilleure HISTIGNORE. Cela vous permet de spécifier un ensemble de modèles à ignorer (tels que rm). C'est mieux (je pense) que de simplement faire passer toute l'histoire /dev/null.

bmatheny
la source
Ah oui, j'ai oublié celui-là :)
Corey Henderson
13
kill -9 $$

Je sais que ce n'est pas aussi meilleur que les réponses précédentes, mais cela tuera le shell Bash actuel sans rien enregistrer, utile lorsque HISTCONTROL n'est pas défini par défaut, vous avez oublié de le définir, ou pur et simple vous avez oublié de mettre un espace de début et vous venez de saisir certains mots de passe et vous ne voulez pas qu'ils restent définitivement dans l'histoire.

C'est le moyen le plus rapide, et quelque chose comme l'effacement du fichier d'historique n'est pas aussi bon car vous devez le faire en dehors d'un shell d'enregistrement d'historique (connectez-vous en tant qu'utilisateur différent et utilisez su / sudo, créez un travail en arrière-plan, etc.)

Le sorcier
la source
8

Vous pouvez faire l'une des deux choses suivantes:

export HISTFILE=/dev/null

Ou, commencez la commande par un espace.

Corey Henderson
la source
5
un espace avant c'est génial
Eric Fortis
8
Certains d'entre nous pensent que l'ignorance automatique des commandes précédées d'un espace est une très mauvaise idée et ne les a donc pas ignorespacedéfinies par défaut.
sorpigal
3
HISTFILECette configuration empêche le stockage de tout historique et n'empêche pas l'ajout de la commande à l'historique en mémoire.
chepner
3

Ou

unset HISTFILE

(similaire à la réponse précédente mais plus courte: export HISTFILE = / dev / null)

aledra
la source
1
Cela n'affecte que l'historique sur disque, pas l'historique en mémoire.
chepner
2

Au démarrage du shell, je nettoie explicitement l'historique des entrées que je ne veux pas être là. Par exemple, je n'en veux pas rm -rfdans l'historique (c'est un traumatisme après avoir supprimé un répertoire plein de résultats traités du jour au lendemain, juste avec un seul Arrow-Up+ Enter:)

J'ai mis l'extrait suivant dans mon fichier init (fonctionne avec .zshrc, devrait également fonctionner avec .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.
la source