为什么echo解释*为做同样的事情ls

为什么echo解释*为做同样的事情ls

考虑这些shell命令

$ls
my_app  newlist  note

$echo *
my_app  newlist  note

$printf *
my_app

第一个命令ls将列出有关文件的信息(默认为当前目录)。第二个命令echo是输出作为参数传递的字符串的命令。但是,当我输入时,echo *它的输出与ls.

并且printf *只给我第一个文件名作为输出

为什么会echo这样解释*呢?为什么printf,更奇怪的是:只输出第一个?

答案1

为什么echo解释*为做同样的事情ls

答案很简单。它不是。echo正如你所说:它迭代其参数并输出它们,它们之间有一个空格。

那么为什么我们会看到这样的行为呢ls

这是因为 shell 会将 替换为*与所有文件匹配的参数列表(不以 a 开头.(除非 dotglob in on))。然后echo就做它的事情。这种全局替换将发生在全部命令,因为它是由 shell 完成的,而不是由命令完成的。

那么呢printf

printf是打印格式。第一个参数是格式。如果你这样做printf "%s " *,那就是这样echo

如果第一个文件是hello%sworld,那么您将得到:hellofile2world hellofile3world

探索更多

尝试这个。它将帮助您了解正在发生的事情。 (我并不是建议您将此代码用于任何实际用途。只是将其用于学习)。

尝试cat /proc/self/cmdline * | less——它将在开始时显示命令行的样子(在 shell 完成其工作之后)。

答案2

只是因为它没有要显示的输入,而是将 *(所有)文件列表作为参数来显示为字符串

就如此容易

而 * 是参数,它会回显“*”内容,因此文件列表

相关内容