zsh por padrão solicita confirmação, quando você tenta executar qualquer comando chamado rm com * como uma palavra inteira na linha de comando (um recurso herdado de tcsh , embora em tcsh , seja não habilitado por padrão).
$ rm -rf *
zsh: sure you want to delete all the files in / [yn]?
Se você tiver que usar bash, com versões recentes de bash , você poderia fazer algo próximo usando extdebug e DEBUG trap:
shopt -s extdebug
check_for_rm_star() {
case $1 in
(rm*[\ /]"* "* | rm*[\ /]\*)
read -p "check_for_rm_star: Are you sure? " -n1 answer < /dev/tty > /dev/tty
echo > /dev/tty
[[ $answer == [yY] ]]
esac
}
trap 'check_for_rm_star "$BASH_COMMAND"' DEBUG
Isso é simplista e funcionaria para rm * e os casos mais comuns, mas não para rm "*" ou /bin/rm * ou : $(rm *) , mas você entendeu. Idealmente, precisaríamos analisar $BASH_COMMAND da mesma forma que o shell para ver se o primeiro argumento se expande para rm ou */rm e para ver se ele passou por um * sem aspas, mas isso pode ' t realmente ser feito de uma forma à prova de balas.