Como posso impedir que o bash execute 'rm' quando '*' é um dos argumentos?

1

Eu quero me segurar de usar acidentalmente

rm [argument_i] * [argument_j]

i.e. ele deve sempre se recusar a executar o comando, quando o caractere de asterisco é separado por espaço em branco em ambos os lados, não importando o que mais esteja antes ou depois do asterisco.

Qual comando devo adicionar ao meu .bashrc para ativar essa verificação?

Obrigado por qualquer sugestão.

    
por TMOTTM 09.02.2013 / 15:17

2 respostas

1

Acho melhor você definir um alias para rm, então sempre que você executar rm, não será rm em si, mas seu alias.

Neste alias você pode analisar tudo.

alias rm='/my/path/myrm.sh'

E esse script pode ter todos os parâmetros que você deseja analisar.

Esse alias deve ser colocado em .bashrc / .bash_profile, ou até mesmo em / etc / profile, se você quiser que ele seja aplicado a todos os usuários.

Editar Após os comentários abaixo, adicionei um wrapper que desativa * interpretado como uma lista de todos os arquivos e se torna apenas uma string.

alias rm='set -f; /bin/sh /home/me/test/rm.sh'

O script pode começar assim:

#!/bin/sh

if echo "$2" | grep '*' > /dev/null; then
    echo "asterisk!"
else
    echo "hi this is $var1 and $var2 and $var3"
fi 

Teste:

$ rm a * b
asterisk!
    
por 09.02.2013 / 15:36
1

Como sugeri em uma pergunta diferente, usar uma armadilha DEBUG que verifique BASH_COMMAND fará o seguinte:

check_for_wildcard_rm() {
  local rm_glob_re='^rm[[:space:]](.*[[:space:]])?[*]([[:space:]]|$)'
  if [[ $BASH_COMMAND =~ $rm_glob_re ]]; then
    echo "Suppressing rm with a bare *" >&2
    return 1
  fi
  return 0
}
shopt -s extdebug
trap check_for_wildcard_rm DEBUG
    
por 15.01.2015 / 01:16

Tags