使用一位数模式的“ls”给出了奇怪的结果

使用一位数模式的“ls”给出了奇怪的结果

我在 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

当我替换时56我得到了非常奇怪的结果:

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

相关内容