为何执行rm *$*命令未仅删除含$符号文件,反而误删全部文件?
为什么
rm *$*会删除所有文件而非仅含$的文件? 核心原因:Shell对$的特殊解析
在Shell(比如Bash)中,$是变量引用的特殊符号,而非普通字符。当你执行rm *$*时,Shell会先对命令行做预解析:
- 中间的
$*会被Shell识别为“引用名为*的变量”,但这个变量几乎不存在,因此会被替换为空字符串。 - 原本的
*$*就变成了**,在默认开启globstar选项的Bash中,**会匹配当前目录下所有文件、子目录及子目录内的内容;就算没开启globstar,*本身也会匹配当前目录下所有非隐藏的文件和子目录。 - 最终
rm接收到的参数是所有匹配项,因此会执行删除所有文件、尝试删除子目录的操作。
正确的写法
要让Shell把$当作普通字符处理,有两种常用方式:
- 用反斜杠转义
$:rm *\$* - 把整个匹配模式用单引号括起来(单引号会阻止Shell解析特殊字符):
rm '*$*'
内容的提问来源于stack exchange,提问作者Messiah
相关产品推荐
相关产品推荐

