Evitando a exclusão de pastas com alias de sistema / shell

1

Existe uma maneira de evitar a exclusão de pastas com alias de sistema / shell? Eu quero que esses comandos falhem. Minha concha é bash.

Como:

$rm -rf .
$rm -rf ..
$rm -rf ~
$rm -rf *
    
por mert inan 10.01.2014 / 22:51

3 respostas

3

Observe que ~ e * são expandidos pelo shell antes passar os argumentos para rm .

A única maneira de fazer isso é definir uma função chamada rm que analisa os argumentos antes de invocar command rm ...

Eu não recomendaria isso. Quando você fica preguiçoso, fica em apuros quando se senta em outro computador sem a autoproteção. Eu costumava alias rm="rm -i" antes que me mordesse.

    
por 10.01.2014 / 23:01
2

Não tenho certeza se há uma resposta para isso, mas uma coisa que eu faço no meu .bashrc é definir GLOBIGNORE=.:.. , isso impede que as expansões glob combinem . e .. . Ele também ativa efetivamente dotglob , que pode não ser o que você deseja ( GLOBIGNORE=.:..:.* para isso). Eu acho isso útil para mim.

    
por 10.01.2014 / 23:00
2

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.

    
por 11.01.2014 / 12:27

Tags