88 votes

Comment supprimer une entrée de l'historique dans ZSH

Disons que j'ai lancé une commande en utilisant un zsh

echo "mysecret" > file

Je peux facilement imprimer l'historique, y compris les numéros d'entrée, en utilisant la commande fc -l :

1  echo "mysecret" >| file

Mais comment supprimer facilement une entrée de l'historique ?

Je ne trouve pas de paragraphe correspondant dans man zshbuiltins .

2 votes

Qu'est-ce que ça fait sur StackOverflow plutôt que sur SuperUser ?

0 votes

112voto

rwilhelm Points 357

*BSD/Darwin (macOS) :

LC_ALL=C sed -i '' '/porn/d' $HISTFILE

Linux (GNU sed) :

LC_ALL=C sed -i '/porn/d' $HISTFILE

Cela supprimera toutes les lignes correspondant à "porno" de votre $HISTFILE.

Avec setopt HIST_IGNORE_SPACE vous pouvez faire précéder la commande ci-dessus d'un caractère d'espacement pour éviter qu'elle ne soit écrite dans $HISTFILE.

Comme Tim l'a souligné dans son commentaire ci-dessous le préfixe LC_ALL=C empêche l'échec de la "séquence d'octets illégale".

66voto

poplitea Points 2162

Je ne sais pas s'il existe une méthode élégante pour faire cela, mais dans des situations similaires, je me suis déconnecté (permettant à zsh de vider son tampon et d'écrire mon historique dans un fichier), puis je me suis connecté, et enfin modifié manuellement ~/.zsh_history en supprimant la ligne "dangereux".

1 votes

Ça a marché pour moi. J'ai dû redémarrer mon terminal pour qu'il prenne en compte les changements.

1 votes

Pour des points bonus, évitez de charger le fichier d'historique en définissant la variable d'environnement HISTFILE=/dev/null ou utilisez simplement un autre shell. Si zsh est le shell de connexion, le login et exec sh puis modifier ~/.zhistory .

0 votes

Cela fonctionne ! Supprimer la commande de ~/.zsh_history puis redémarrez zsh.

34voto

Michael Barton Points 957

Si vous utilisez l'option HIST_IGNORE_SPACE dans zsh, vous pouvez faire précéder les commandes d'un espace " " et elles ne seront pas mémorisées dans le fichier d'historique. Si vous avez des commandes secrètes que vous utilisez couramment, vous pouvez faire quelque chose de ce genre : alias hiddencommand=' hiddencommand' .

6 votes

Mettre setopt histignorespace dans votre ~/.zshrc

0 votes

Merci pour histignorespace . Très utile !

5voto

pilgix Points 85

Je pense que la solution que j'ai trouvée est plus simple.

Dans un terminal zsh (sous mac os)

  1. J'ai fermé la session du terminal dans laquelle se trouvait une commande que je voulais supprimer.
  2. Ouverture d'une nouvelle session,
  3. Ouvrez ~/.zsh_history avec un éditeur de texte (j'ai utilisé emacs mais nano ou n'importe quel autre ferait l'affaire, je suppose),
  4. supprimé les lignes défectueuses, fermé l'éditeur,
  5. a fermé la session du Terminal,
  6. a ouvert une nouvelle session Terminal,
  7. inscrit à history et le histoire indésirable L'objet a disparu.

Assurez-vous que emacs n'a pas sauvegardé l'instance précédente de .zsh_history.

(Solution basée sur https://til.hashrocket.com/posts/zn87awopb4-delete-a-command-from-zsh-history- )

4voto

Marlon Richert Points 1513

Cette fonction supprimera n'importe quelle ligne de votre historique Zsh, sans poser de questions :

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out the history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print "Deleted '$HISTORY_IGNORE' from history."
}

Si vous voulez en plus empêcher tous les dc pour éviter que les commandes ne soient écrites dans l'historique, ajoutez ce qui suit dans votre fichier ~/.zshrc fichier :

zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

Mise à jour

J'ai maintenant publié une solution plus complète sous forme de plugin : https://github.com/marlonrichert/zsh-hist

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X