当 ' * ' 是参数之一时,如何防止 bash 执行 'rm'?

当 ' * ' 是参数之一时,如何防止 bash 执行 'rm'?

我希望确保自己不会意外使用

rm [argument_i] * [argument_j]

即当星号字符两侧由空格分隔时,它应该始终拒绝执行该命令,无论星号之前或之后是什么。

我应该添加哪个命令.bashrc来启用这样的检查?

谢谢任何提示。

答案1

我认为你最好为 rm 定义一个别名,这样,无论何时执行 rm,它就不是 rm 本身而是你的别名。

在这个别名中你可以解析一切。

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

并且这个脚本可以有你想要的所有参数解析。

如果您希望它适用于所有用户,则应将此别名放在 .bashrc / .bash_profile 中,甚至放在 /etc/profile 中。

编辑 根据下面的评论,我添加了一个包装器,它禁用 * 解释为所有文件的列表,而变成一个字符串。

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

脚本可以像这样开始:

#!/bin/sh

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

测试:

$ rm a * b
asterisk!

答案2

正如我在另一个问题中所建议的那样,使用检查 BASH_COMMAND 的 DEBUG 陷阱就可以达到目的:

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

相关内容