从 cygwin 回来后,我对 Ubuntu 10.4 上的 bash(版本 4.1.5)通配感到非常困惑。我喜欢以下两种可能性之一:
- 忽略
.
and..
,匹配其他所有内容 - 忽略以点开头的文件名,除非明确给出
当前的行为很奇怪:
cd; ls .*
说“ls:无法访问.*:没有这样的文件或目录”,尽管我明确要求以点开头的文件名。
cd; ls .gnupg/*.gpg
也抱怨虽然我要求不以点开头的文件(这只是以点开头的目录名)。
输出shopt -p
(已删除)
解决方案
我已更改shopt
为其他用户的值(没有此问题),但没有帮助。然后我想到了将我的一分为二.bashrc
并找到包含类似内容的违规行的想法GLOBIGNORE='.[!/.]*:..[!/]*:*/.[!/.]*:*/..[!/]*:
......
我已将其替换为GLOBIGNORE='.:..'
,它几乎可以满足我的要求,并且有效。
答案1
不幸的是,我必须回答我自己的问题。它是GLOBIGNORE
。从手册页:
以冒号分隔的模式列表,定义路径名扩展要忽略的文件名集。如果与路径名扩展模式匹配的文件名也与 GLOBIGNORE 中的模式之一匹配,则会将其从匹配列表中删除。
答案2
“ls:无法访问.*:没有这样的文件或目录”错误听起来像是当前目录存在权限问题。我可以用以下方法重现它:
$ mkdir -p ~/tmp/tmp
$ cd ~/tmp/tmp
$ ls .*
.:
..:
tmp
$ chmod u-r .
$ ls .*
ls: cannot access .*: No such file or directory
$ ls -ldn .
d-wxr-xr-x 2 1000 1000 4096 2012-03-12 18:31 .
$ chmod u+r .
$ ls .*
.:
..:
tmp
我建议运行chmod +r .
并再次尝试ls .*
。
答案3
您很可能没有与 glob 匹配的文件。如果没有文件匹配,bash
则默认按*
字面解释。您可能希望设置nullglob
usingshopt -s nullglob
来避免这种情况(尽管如果没有文件匹配,这将使命令完全没有参数)。