为何ls M*与ls m*能匹配到子目录下的ManagerGit?其机制是什么?
问题背后的shell通配符与ls行为机制
这个现象的核心是**shell的路径扩展(globbing)**和ls命令的默认行为共同作用的结果,咱们一步步拆解清楚:
1. 通配符是由shell先处理的,不是ls
当你输入ls M*或者ls m*时,不是ls去匹配文件名,而是你的shell(比如bash)先对通配符*进行扩展:
- 对于
ls M*:shell会扫描当前目录,找出所有以M开头的条目——这里就是Manager目录,所以shell会把原命令替换成ls Manager,再传给ls执行。 - 对于
ls m*:这说明你的shell开启了大小写不敏感的路径扩展(比如bash中通过shopt -s nocaseglob配置),所以m*会匹配以M或m开头的条目,同样会扩展成ls Manager。
2. ls接收目录参数时的默认行为
当ls的参数是一个目录名(这里就是Manager)时,它默认不会只显示目录名,而是列出该目录下的所有内容。所以ls Manager执行后,就会输出这个目录里的子目录ManagerGit——这就是你看到的结果。
3. 为什么ls | grep -i 'manage'只显示Manager?
当你直接执行不带参数的ls时,它默认列出当前目录下的所有条目,也就是Manager这个目录名。管道会把ls的输出传给grep,grep -i 'manage'匹配到Manager后就输出它——这时候没有通配符需要shell扩展,ls输出的是当前目录的内容,自然看不到子目录里的ManagerGit。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

