如何实现为rm -rf命令添加确认提示的Bash函数
解决rm -rf命令的自定义确认提示问题
你的脚本存在几个关键问题导致无法正常运行:
- 参数判断逻辑错误:rm的选项可能是拆分形式(比如
-r -f)或合并形式(-rf),你只判断了$1 = "-rf"的情况,无法覆盖拆分输入场景;且-eq是数字比较运算符,字符串比较需用=。 - 递归调用死循环:自定义函数内直接写
rm -rf "$@"会再次触发你定义的rm()函数,导致无限循环,必须用command rm调用系统原生rm命令。 - 变量引用不规范:判断变量时未给变量加引号(比如
[ ans -eq "yes" ]应改为[ "$ans" = "yes" ]),容易因空值或特殊字符引发错误。
正确实现脚本
将以下代码添加到~/.bashrc文件中:
rm() { # 标记是否同时包含-r和-f选项 local has_r=false local has_f=false # 遍历所有参数,检查选项 for arg in "$@"; do if [[ "$arg" == "-r" || "$arg" == "--recursive" ]]; then has_r=true elif [[ "$arg" == "-f" || "$arg" == "--force" ]]; then has_f=true elif [[ "$arg" == -* ]]; then # 处理合并选项,比如-rf、-fr等 if [[ "$arg" == *r* ]]; then has_r=true fi if [[ "$arg" == *f* ]]; then has_f=true fi fi done # 同时包含-r和-f时,弹出确认提示 if $has_r && $has_f; then read -p "Do you really want to delete with rm -rf? Type 'yes' to confirm: " ans # 若需忽略大小写,可改为[[ "${ans,,}" == "yes" ]] if [[ "$ans" != "yes" ]]; then echo "Deletion canceled." return 0 fi fi # 执行原生rm命令 command rm "$@" }
说明
- 遍历所有参数,覆盖
-r -f、-rf、-fr、--recursive --force等所有可能的输入形式; - 用
command rm避免递归调用自定义函数; - 变量引用均加双引号,防止空格或特殊字符导致的错误;
- 可根据需求调整确认字符串的匹配规则(比如支持大小写不敏感)。
修改完成后,执行source ~/.bashrc让配置立即生效,之后输入rm -rf相关命令就会弹出确认提示。
内容的提问来源于stack exchange,提问作者user20688587
相关产品推荐
相关产品推荐

