考虑这些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,甚至更奇怪:只输出第一个?
echo解释*为做同样的事ls答案很简单。它不是。echo完全按照你说的做:它遍历它的参数并输出它们,它们之间有一个空格。
ls?这是因为 shell 将*用一个匹配所有文件的参数列表替换.。然后echo就是做它的事情。这种全局替换将发生在所有命令上,因为它是由 shell 完成的,而不是由命令完成的。
printf?printf是打印格式。第一个参数是格式。如果你这样做printf "%s " *,那么就像echo。
如果第一个文件是hello%sworld,那么你会得到:hellofile2world hellofile3world
尝试这个。它将帮助您了解正在发生的事情。(我不是建议您将此代码用于任何真实的事情。仅将其用于学习)。
试试cat /proc/self/cmdline * | less——它会在开始时显示命令行的样子(在 shell 完成它的部分之后)。