我不记得我列出了一个子目录并/bin/rm -f *在当前目录中执行了多少次。任何人都可以提出建议来帮助我避免这种情况吗?如果我希望系统在我尝试执行时警告我危险,我该/bin/rm -f *怎么办?
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,您可以通过使用extdebug和DEBUG陷阱来做一些接近的事情:
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,并查看它是否传递了未加引号的*,但这并不能真正以防弹方式完成。