我希望确保自己不会意外使用
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