LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 917|回复: 4

ls [a-z].c为什么不对?

[复制链接]
发表于 2008-5-28 11:55:05 | 显示全部楼层 |阅读模式
不是通配符吗?为什么说找不到文件[a-z].c?
发表于 2008-5-28 12:22:42 | 显示全部楼层
ls不支持正则式。[a-z]是正则式而不是通配符。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-28 12:27:34 | 显示全部楼层
那到底哪些常用命令支持(或不支持)呢?能否大致说一下?
回复 支持 反对

使用道具 举报

发表于 2008-5-28 13:39:27 | 显示全部楼层
楼主要明白这里的表达式是由谁来处理的.

这里, ls [a-z].c 是按照这样的方式被 shell 处理的:
* 寻找匹配 [a-z].c 的文件, 如有则将此表达式展开成匹配后的结果. 比如如果当前目录下有 a.c d.c 那么 [a-z].c 就展开成 a.c d.c
* 找不到匹配项则不展开
* 按照展开后的结果执行 ls. 如果有匹配项的话, 那么可能会是 ls a.c d.c 的形式. 没有匹配项时就等效为 ls '[a-z].c' 的形式.

因此, 这里并不是 ls 对参数进行匹配, 而是 sh.

再举个例子. 像 grep 'a.*b' filename 这样的, a.*b 不会被 sh 扩展, 对其进行的处理是 grep 本身进行的. 假如写成 grep a.*b filename, 如果刚好当前目录有 a.bb a.fb 这样两个文件, 那么传给 grep 的参数就被扩展成了 grep a.bb a.fb filename 的形式, 就不正确了. 因此使用 grep 时才推荐用引号扩起表达式.

另一方面, 楼主可能见过 ls {a,b,c}.c 这样的表达式, 那么它与 ls [a-c].c 有何不同呢? 前者是直接 "展开" 成 ls a.c b.c c.c 的形式, 而后者则是 "匹配".
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-28 14:25:48 | 显示全部楼层
谢谢remote fish,尤其是对{}的解释让我茅塞顿开。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表