UPDATE 2022-09-05:

UPDATE 2022-09-05:

In meinemÄhnlicher BeitragVor vielen Jahren habe ich eine Lösung gefunden, wie ich im Bash-Verlauf gespeicherte „gefährliche“ Befehle auskommentieren kann, damit ich sie nicht versehentlich ausführe.

Was wäre die beste Lösung, um dasselbe zu implementieren zsh?

Bietet es zsheine Funktionalität, die ich für diesen Zweck verwenden könnte? Ich nehme an, zshdass dies in einfacher sein sollte, da es flexibler ist zsh.

Als Referenz habe ich Folgendes verwendet bash(basierend auf der akzeptierten Antwort von Stéphane Chazelas):

fixhist() {
   local cmd time histnum
   cmd=$(HISTTIMEFORMAT='<%s>' history 1)
   histnum=$((${cmd%%[<*]*}))
   time=${cmd%%>*}
   time=${time#*<}
   cmd=${cmd#*>}
   case $cmd in
     (cp\ *|mv\ *|rm\ *|cat\ *\>*|pv\ *|dd\ *)
       history -d "$histnum" # delete
       history -a
       [ -f "$HISTFILE" ] && printf '#%s\n' "$time" " $cmd" >> "$HISTFILE";;
     (*)
       history -a
   esac
   history -c
   history -r
}

UPDATE 2022-09-05:

Die akzeptierte Lösung funktioniert, hat aber unbeabsichtigte Nebeneffekte. Sie bringt insert-last-worddie Tastenbelegung durcheinander. Hier eine kurze Illustration:

Ich verwende einen meiner "gefährlichen" Befehle:

rm zz

es wurde dem Verlauf mit einem Kommentar (falls gewünscht) hinzugefügt:

history
...
# rm zz

Fügen wir einfach einen weiteren Befehl zur Geschichte hinzu

echo foo

AltUnd wenn ich jetzt mit + durch den Verlauf blättern möchte ., erhalte ich folgende Ergebnisse:

echo <Alt> + .

foo
history
# rm zz

anstatt dass es mir angeboten wird zz, wird mir der ganze kommentierte Befehl angeboten # rm zz.

Wie kann ich das beheben?

Antwort1

Verwenden Sie unbedingt die zshaddhistoryHook-Funktion und deaktivieren Sie die normale Verlaufsverarbeitung.

function zshaddhistory() {
  # defang naughty commands; the entire history entry is in $1
  if [[ $1 =~ "cp\ *|mv\ *|rm\ *|cat\ *\>|pv\ *|dd\ *" ]]; then
    1="# $1"
  fi
  # write to usual history location
  print -sr -- ${1%%$'\n'}
  # do not save the history line. if you have a chain of zshaddhistory
  # hook functions, this may be more complicated to manage, depending
  # on what those other hooks do (man zshall | less -p zshaddhistory)
  return 1
}

Getestet auf zsh 5.0.8

% exec zsh
% echo good
good
% echo bad; rm /etc 
bad
rm: /etc: Operation not permitted
% history | tail -4
  299  exec zsh
  300  echo good
  301  # echo bad; rm /etc
  302  history | tail -4
%   

Dies scheint extendedhistoryauch mit dem Optionssatz zu funktionieren.

Antwort2

Die folgende Funktion basiert auf der von Thrig und behebt histignorespace:

function zshaddhistory() {
  if [[ $1 =~ "^ " ]]; then
    return 0
  elif [[ $1 =~ "cp\ *|mv\ *|rm\ *|cat\ *\>|pv\ *|dd\ *" ]]; then
    1="# $1"
  fi
  # write to usual history location
  print -sr -- ${1%%$'\n'}
  # do not save the history line. if you have a chain of zshaddhistory
  # hook functions, this may be more complicated to manage, depending
  # on what those other hooks do (man zshall | less -p zshaddhistory)
  return 1
}

verwandte Informationen