Com versões recentes de bash
:
typetext() {
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' "$@"
}
checkrm() {
local re='\<rm\>.*[[:blank:]]([.*~]|\.\.)([[:blank:]]|$)'
if [[ $READLINE_LINE =~ $re ]]; then
printf > /dev/tty "Are you sure? "
read -n1 k
echo
if [[ $k != [yY] ]]; then
READLINE_LINE=
return
fi
fi
typetext $'\n'
} <> /dev/tty >&0
bind -x '"\C-m": checkrm'
Basicamente, ao pressionar Return , nossa função checkrm
é invocada.
Aparece na linha de comando inserida no momento ( $READLINE_LINE
para o qual você precisa bash 4.3 ou mais recente) para uma palavra rm
(também corresponde a /bin/rm
, mas não em rmdir
) seguida por *
, .
, ~
ou ..
argumento.
Se corresponder, ele solicitará a confirmação do usuário. Se confirmado, um caractere de nova linha é inserido no tty input buffer para que o comando seja aceito (ambos CR e LF estão ligados a aceitar linha , estamos apenas envolvendo CR); se não, o buffer atual é esvaziado.
Observe que, com versões de bash
anteriores a 4.4, houve um erro que fez a readline parar de funcionar corretamente quando um trabalho foi suspenso.