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.