我在 MacPro 上的 VMWare Fusion 中以 VM 形式运行 Ubuntu:
ayakovlev@ubuntu:~$ uname -a
Linux ubuntu 3.11.10.3 #1 SMP Thu Mar 6 15:31:54 EST 2014 x86_64 x86_64 x86_64 GNU/Linux
下面的命令输出我期望的结果:
ayakovlev@ubuntu:~$ ls /usr/include/*5*
ax25.h
当我替换时5
,6
我得到了非常奇怪的结果:
ayakovlev@ubuntu:~$ ls /usr/include/*6*
a.out.h asm bits c++ fpu_control.h gnu ieee754.h sys zconf.h
这可能是什么原因造成的?
答案1
中的通配符会ls /usr/include/*6*
扩展为匹配的内容。在第一种情况下,它匹配特定的常规文件。但是,如果它匹配诸如 之类的目录/usr/include/x86_64-linux-gnu
,它将打印出这些目录的内容(即它将扩展为ls /usr/include/x86_64-linux-gnu
)。
您可以验证通配符是否已扩展为带有 的目录ls /usr/include | grep 6
。
答案2
正如 @Sparhawk 所解释的那样,您正在列出目录的内容。据我所知,这不取决于您使用的 *nix,这是 GNU 的默认行为ls
。非 GNU 实现可能有所不同,但我对此表示怀疑。
运行此命令时:
ls /usr/include/*6*
glob ( *6*
) 由你的 shell 扩展(例如 bash)前调用ls
。因此,给出以下目录结构:
.
├── dir1
│ ├── file1
│ └── file2
└── dir2
├── file1
└── file2
ls d*
将扩展为ls dir1 dir2
,并给出您期望的结果:
dir1:
file1 file2
dir2:
file1 file2
这是ls
处理多种的默认情况下,它会列出找到的每个目录,然后列出该目录的内容。但是,如果在单个目录上运行它,则不会打印名称:
$ ls d*1
file1 file2
*6*
因此,由于glob 只有一个匹配项,并且该匹配项是一个目录,因此您将使用单个目录作为输入/usr/include
运行,因此它列出了目录的内容而不包括目录名称。ls