配置 bash 通配符

配置 bash 通配符

从 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则默认按*字面解释。您可能希望设置nullglobusingshopt -s nullglob来避免这种情况(尽管如果没有文件匹配,这将使命令完全没有参数)。

相关内容