ACTUALIZACIÓN 2022-09-05:

ACTUALIZACIÓN 2022-09-05:

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?

¿ zshProporciona alguna funcionalidad que podría utilizar para este propósito? Supongo que, zshal 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-wordla 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 zshaddhistoryfunció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
%   

extendedhistoryEsto 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
}

información relacionada