Pour empêcher la journalisation des commandes "dangereuses" dans l'historique bash, j'ai ajouté la ligne suivante à mon .bashrc
fichier:
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
cela fonctionne bien, mais cela a un effet secondaire: je ne peux pas voir l'historique complet des commandes exécutées sur une machine. Disons que j'ai plusieurs machines pour les expériences, et je veux pouvoir voir toutes les commandes exécutées. J'utiliserais le bash internal history
pour afficher les commandes exécutées, et peut-être grep pour la date d'aujourd'hui:
history | grep Sep-28
Ce que j'aimerais avoir, c'est aussi enregistrer les commandes "dangereuses", mais mettre un #
au début de la ligne, de sorte que si j'exécute la commande à partir de l'historique par erreur, aucun dommage ne soit fait.
Je n'ai aucune idée si c'est possible.
Mise à jour et clarification:
La principale raison pour laquelle cela pose problème est que je suis généralement connecté à ma machine à partir de plusieurs terminaux, et toute commande exécutée sur un terminal est immédiatement lue dans l'historique des autres terminaux. Ceci est réalisé par
PROMPT_COMMAND="history -a; history -c; history -r"
Imaginons que j'ai deux terminaux ouverts. Dans l'un, j'ai un cat /dev/foo > file.out
processus en cours. Dans la seconde, je vérifie la progression avec ls -lAhF
. Je continue de répéter ls
en appuyant sur Upet ENTER(c'est-à-dire, la dernière commande de l'historique). Dès que la première commande se termine, la dernière commande de l'historique n'est plus ls
, mais cat /dev/foo > file.out
. Si je ne fais pas attention, je vais redémarrer cat et écraser file.out.
Ce que j'aimerais réaliser, c'est que la commande cat serait précédée d'un #
, afin qu'elle ne soit pas exécutée. Cependant, je le verrais toujours dans l'histoire et je peux le réutiliser (s'il s'agit d'une commande longue) en le décommentant.
la source
watch ls -lAhF
ouwhile sleep 1; do ls -lAhf; done
; au lieu de regarder la taille du fichier, vous pouvez utiliserpv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ).Réponses:
Vous pourriez faire quelque chose comme:
L'idée étant qu'avant chaque invite, nous vérifions la dernière entrée d'historique (
history 1
) et si c'est l'une des plus dangereuses , nous la supprimons (history -d
) et la rajoutons avec un#
avechistory -s
.(évidemment, vous devez supprimer votre
HISTIGNORE
paramètre).Un effet secondaire indésirable de cela est qu'il modifie la temps de l' histoire de ceux
rm
,mv
... commandes.Pour résoudre ce problème, une alternative pourrait être:
Cette fois, nous enregistrons l'heure de la dernière histoire, et pour rajouter la ligne d'historique, nous utilisons à
history -r
partir d'un fichier temporaire (le document ici) qui inclut l'horodatage.Vous voudriez que cela
fixhist
soit fait avant votrehistory -a; history -c; history -r
. Malheureusement, la version actuelle debash
contient un bogue quihistory -a
ne sauvegarde pas la ligne supplémentaire que nous avons ajoutée. Une solution consiste à l'écrire à la place:C'est d'ajouter la commande commentée au HISTFILE nous-mêmes au lieu de le laisser
history -a
faire.la source
cmd=${cmd#*[0-9] }
fait? Et où dois-je mettrefixhist
monPROMPT_COMMAND
? Pour le moment, il contient déjàPROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? J'ai déjà misexport HISTTIMEFORMAT="%b-%d %H:%M "
. Soit dit en passant, lorsque j'ajoute votre code dans mon$HOME/.bashrc
, rien ne se passe.HISTTIMEFORMAT=/
est uniquement pour cette invocation dehistory
pour obtenir une sortie comme123 /rm x
où il est plus facile d'extraire la cmd. Il y avait un problème avec certaines versions d'bash
où$HISTCMD
était faux dans ce contexte, essayez la nouvelle version.#
le code ne fait-il pas office de commentaires.bashrc
?bash
insère un*
après le numéro d'historique qui n'était pas attendu. Devrait être corrigé maintenant.Je ne vais pas répondre exactement à votre question, mais peut-être vous donner une solution alternative à votre problème.
Si je comprends bien, vous vous inquiétez des erreurs que vous pourriez commettre en tapant, par exemple,
!rm
s'il arrivait que larm
commande précédente de l'historique supprime quelque chose que vous aimeriez conserver.Dans ce cas, une belle option bash est
histverify
. Si vousshopt -s histverify
, et si vous vous souvenez d'une commande avec le bang!
, elle ne s'exécutera pas immédiatement, mais sera chargée dans la ligne de lecture afin que vous puissiez décider de l'exécuter ou non, et cela vous donne également la possibilité de la modifier.Essayez-le:
Sans
histverify
:Avec
histverify
:Dans ce cas, vous aurez le curseur à la fin de la ligne, prêt à le relancer - ou non - ou à le modifier.
Si vous aimez cette option, mettez-la dans votre
.bashrc
:la source