“ls *”的输出不一致

时间:2013-12-10 14:03:06

标签: linux bash shell unix ls

对命令“ls *”的输出感到困惑。我在Ubuntu 11.10和Redhat Enterprise 6.3中测试了下面的场景,得到了相同的结果。

外壳日志

$ uname -a
   Linux 2.6.32-279.19.1.el6.x86_64 #1 SMP Sat Nov 24 14:35:28 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
$ echo $0
   -bash
$ cd test
$ ls
$ ls *             *<== at first, no file/directory under current work directory*
ls: cannot access *: No such file or directory
$ mkdir abc        *<== create a new directory "abc"*
$ ls *             *<== output of "ls *" is empty but directory "abc" has been created.*
$ mkdir abcd       *<== create the second directory "abcd"*
$ ls *             *<== at this point, all the directories("abc" and "abcd") are displayed.*
abc:

abcd:

任何人都可以解释为什么在创建目录“abc”之后“ls *”的输出为空?感谢。

3 个答案:

答案 0 :(得分:11)

这主要是因为glob模式是由shell扩展的,而不是ls本身。

因此,在创建一个空的abc目录后,发出:

$ ls *

调用ls的结果,就像您键入的一样:

$ ls abc

其中列出了abc的内容。由于abc为空,因此不会打印任何内容。

以同样的方式,在创建abcd后,发出:

$ ls *

调用ls的结果,就像您键入的一样:

$ ls abc abcd

由于传递了两个目录,ls会在列出其(空)内容之前将每个目录打印为标题。

答案 1 :(得分:6)

因为ls *正在打印目录abcd的内容为空,因此您不会在输出中看到任何内容。 ls *打印当前目录中的所有文件和所有目录的内容

请尝试使用此ls命令:

ls -d *

将在输出中显示abcd

来自man ls

-d      Directories are listed as plain files (not searched recursively).

答案 2 :(得分:6)

这不会回答您的问题,但会解决*: no such file错误。

如果未设置bash shell选项nullglob,如果通配符扩展为 no files ,则shell将字面上的通配符作为纯字符串。

$ ls
$ ls *
ls: cannot access *: No such file or directory

没有文件,因此shell将 * 视为普通字符串。

启用nullglob选项,shell将替换通配符:

$ shopt -s nullglob
$ ls *
$