执行rm -rf A/$b命令后目录A被意外删除的底层原因问询
命令执行后删除目录A的底层逻辑
根因:Shell 变量扩展优先级高于命令执行,$b变量未赋值/为空值
Shell在执行任何命令前,会先完成变量替换、通配符扩展、引号解析等前置操作,再把最终的参数传给目标命令,整个执行流程如下:
- 你输入的原始命令为
rm -rf A/$b.,如果当前Shell环境中没有给变量b设置过值,$b会被扩展为空字符串。 - 变量扩展完成后,路径参数
A/$b.会被拼接为A/.(A/+ 空值 +.=A/.)。 - Linux系统中每个目录默认存在两个特殊硬链接:
. 指向目录本身,.. 指向目录的上级目录,因此A/.本质上就是目录A的等价引用。 rm -rf接收到最终参数后,会递归删除A/.指向的所有内容,包括A目录下的全部子文件、子目录,最后删除A目录本身。
补充场景:如果你输入的命令实际是
rm -rf A/$b/(末尾是斜杠而非点),$b为空时扩展结果为A//,Linux路径中连续的斜杠会被视为单个斜杠,等价于A/,rm -rf A/自然会直接删除整个A目录。
内容的提问来源于stack exchange,提问作者Jagan
相关产品推荐
相关产品推荐

