|
发表于 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 的形式, 而后者则是 "匹配". |
|