
En miPublicación relacionadaHace muchos años, encontré una solución para comentar comandos "peligrosos" guardados en el historial de bash, para no ejecutarlos accidentalmente.
¿Cuál sería la mejor solución para implementar lo mismo zsh
?
¿ zsh
Proporciona alguna funcionalidad que podría utilizar para este propósito? Supongo que, zsh
al ser más flexible, esto debería ser más fácil en zsh
.
Como referencia, esto es lo que he estado usando bash
(basado en la respuesta aceptada de 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
}
ACTUALIZACIÓN 2022-09-05:
La solución aceptada funciona, pero tiene efectos secundarios no deseados. Se estropea con insert-last-word
la combinación de teclas. Aquí una breve ilustración:
Utilizo uno de mis comandos "peligrosos":
rm zz
se ha agregado al historial con un comentario (según se desee):
history
...
# rm zz
Agreguemos otro comando al historial.
echo foo
Y ahora, cuando quiero recorrer el historial con Alt+ ., obtengo los siguientes resultados:
echo <Alt> + .
foo
history
# rm zz
en lugar de ofrecerme zz
, me ofrecen todo el comando comentado # rm zz
.
Cómo puedo arreglar esto ?
Respuesta1
Claro, use la zshaddhistory
función de enlace y desactive el manejo regular del historial.
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
}
Probado así en 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
%
extendedhistory
Esto también parece funcionar con el conjunto de opciones.
Respuesta2
La siguiente función se basa en la del thrig y soluciona 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
}