"ls*"的输出不一致

thi*_*khy 4 unix linux bash shell 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:
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么在创建目录"abc"后输出"ls*"为空?谢谢.

Fré*_*idi 11

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

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

$ ls *
Run Code Online (Sandbox Code Playgroud)

ls像键入一样调用结果:

$ ls abc
Run Code Online (Sandbox Code Playgroud)

其中列出了内容abc.由于abc是空的,所以没有打印.

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

$ ls *
Run Code Online (Sandbox Code Playgroud)

ls像键入一样调用结果:

$ ls abc abcd
Run Code Online (Sandbox Code Playgroud)

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


anu*_*ava 6

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

请尝试此ls命令:

ls -d *
Run Code Online (Sandbox Code Playgroud)

这将显示abcd在输出中.

man ls

-d      Directories are listed as plain files (not searched recursively).
Run Code Online (Sandbox Code Playgroud)


gle*_*man 6

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

如果未设置bash shell选项nullglob,如果通配符扩展为无文件,则shell将字面上的通配符作为纯字符串.

$ ls
$ ls *
ls: cannot access *: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

打开nullglob选项,shell将替换通配符:

$ shopt -s nullglob
$ ls *
$
Run Code Online (Sandbox Code Playgroud)