zsh history: comente comandos perigosos: '#'

7

No meu post relacionado muitos anos atrás, eu encontrei um solução como comentar comandos "perigosos" salvos no histórico bash, para que eu não os execute acidentalmente.

Qual seria a melhor solução para implementar o mesmo em zsh ?

O zsh fornece alguma funcionalidade que eu poderia usar para essa finalidade? Eu assumo, zsh beieng mais flexível, isso deve ser mais fácil em zsh .

Para referência, é isso que tenho usado em bash (com base na resposta aceita 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
}

UPDATE:

Enquanto a solução aceita funciona, tem efeitos colaterais indesejados. Em particular, as seguintes opções de histórico especificadas em zshrc agora estão sendo ignoradas

setopt histignorespace
setopt histreduceblanks

Como posso fazê-los funcionar novamente?

    
por Martin Vegter 26.09.2016 / 23:33

2 respostas

4

Claro, use a função zshaddhistory hook e desabilite o controle regular de histórico.

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
}

Testado assim no 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
%   

Isso parece funcionar também com o conjunto de opções extendedhistory .

    
por 27.09.2016 / 00:12
1

A seguinte função é baseada na função do thrig e corrige 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
}
    
por 19.04.2017 / 02:52