如何禁止/bin/rm -f * 的执行?

ct5*_*586 6 bash rm

我不记得我列出了一个子目录并/bin/rm -f *在当前目录中执行了多少次。任何人都可以提出建议来帮助我避免这种情况吗?如果我希望系统在我尝试执行时警告我危险,我该/bin/rm -f *怎么办?

Sté*_*las 9

zsh默认情况下,提示您确认时,当您尝试运行调用的任何命令rm*在命令行上整个单词(继承自一个特点tcsh,虽然在tcsh它不是默认启用)。

$ rm -rf *
zsh: sure you want to delete all the files in / [yn]?
Run Code Online (Sandbox Code Playgroud)

如果您必须使用 bash,使用最新版本的bash,您可以通过使用extdebugDEBUG陷阱来做一些接近的事情:

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
Run Code Online (Sandbox Code Playgroud)

这是一个简单的方法,适用于rm *最常见的情况,但不适用于rm "*"or/bin/rm *: $(rm *),但您明白了。理想情况下,我们需要解析$BASH_COMMAND与 shell 相同的内容,以查看第一个参数是否扩展为rmor */rm,并查看它是否传递了未加引号的*,但这并不能真正以防弹方式完成。