
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 zsh
eine Funktionalität, die ich für diesen Zweck verwenden könnte? Ich nehme an, zsh
dass 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-word
die 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 zshaddhistory
Hook-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 extendedhistory
auch 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
}