
No meupostagem relacionadahá muitos anos, encontrei uma solução para comentar comandos "perigosos" salvos no histórico do bash, para não executá-los acidentalmente.
Qual seria a melhor solução para implementar o mesmo zsh
?
Fornece zsh
alguma funcionalidade que eu poderia usar para essa finalidade? Presumo que, zsh
sendo mais flexível, isso deve ser mais fácil no zsh
.
Para referência, é isso que tenho usado 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
}
ATUALIZAÇÃO 2022-09-05:
A solução aceita funciona, mas tem efeitos colaterais não intencionais. Isso atrapalha insert-last-word
a combinação de teclas. Aqui está uma breve ilustração:
Eu uso um dos meus comandos "perigosos":
rm zz
foi adicionado ao histórico com um comentário (conforme desejado):
history
...
# rm zz
Vamos apenas adicionar outro comando ao histórico
echo foo
E agora, quando quero percorrer o histórico com Alt+ ., obtenho os seguintes resultados:
echo <Alt> + .
foo
history
# rm zz
em vez de ser oferecido zz
, estou recebendo todo o comando comentado # rm zz
.
Como posso consertar isso ?
Responder1
Claro, use a zshaddhistory
função hook e desative o tratamento regular do 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 extendedhistory
também com o conjunto de opções.
Responder2
A função a seguir é baseada na 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
}