为什么 echo * 表现得像 ls 而 printf * 不是?

moh*_*eem -1 linux shell bash

考虑这些shell命令

$ls
my_app  newlist  note
Run Code Online (Sandbox Code Playgroud)

$echo *
my_app  newlist  note
Run Code Online (Sandbox Code Playgroud)

$printf *
my_app
Run Code Online (Sandbox Code Playgroud)

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

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

为什么要这样echo解释*?为什么printf,甚至更奇怪:只输出第一个?

ctr*_*lor 6

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

答案很简单。它不是。echo完全按照你说的做:它遍历它的参数并输出它们,它们之间有一个空格。

那么为什么我们会看到类似的行为ls

这是因为 shell 将*用一个匹配所有文件的参数列表替换.。然后echo就是做它的事情。这种全局替换将发生在所有命令上,因为它是由 shell 完成的,而不是由命令完成的。

那么呢printf

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

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

探索更多

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

试试cat /proc/self/cmdline * | less——它会在开始时显示命令行的样子(在 shell 完成它的部分之后)。