考虑这些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
只是因为它没有要显示的输入,而是将 *(所有)文件列表作为参数来显示为字符串
就如此容易
而 * 是参数,它会回显“*”内容,因此文件列表