谁处理(解释)*
echo *
回声是否看到星号或外壳是否关心它并返回文件名列表..
关于什么
cp temp temp*
答案1
bash(或任何你使用的 shell)是第一个读取任何输入的东西,并将开始解释特殊字符,例如?
和*
。*
扩展到匹配的任何内容慢性疾病,这意味着星号被所述匹配项替换。
在大多数情况下,这是相当简单的,但有时会导致一些令人困惑的情况。
考虑以下情况。目录包含以下内容:
- 测试(常规文件)
- test1(目录)
- test2(目录)
- test3(目录)
如果您随后输入mv *
一些看似奇怪的内容,则会发生这种情况:test3
存在,但其余部分消失了。虽然一开始很奇怪,但一旦您了解 bash 实际上传递给 的内容,它就说得通了mv
。由于星号,bash 将其解释mv *
为mv test test1 test2 test3
,并且当 mv 获取该列表时,它会假设最后一个参数是目标,即所有文件将被移动到的目标。
至于您列出的命令:
echo *
可以起到 poor-mans 的作用ls
。shell 会将星号扩展为该目录中的任何内容,我相信您已经知道,echo
它将逐字逐句地回显 bash 传递给它的作为参数的所有内容。cp temp temp*
其行为有点像mv
我上面描述的命令,除非只有一个名为 temp 的目录,在这种情况下源和目标名称相同,即它什么也不做。
答案2
如前所述,shell 会扩展,*
因此echo
会接收 shell 在当前目录中找到的任何参数。但是,请注意,如果扩展结果为空,即如果目录不包含非隐藏文件,则将*
保持不变并按原样传递给调用的命令(除非在某些 shell 中使用了非标准选项,例如bash
.)echo *
,那么不会像穷人的命令那样运行,ls
因为前者不会打印任何内容,而后者会打印*
.
类似地,如果当前目录中还没有一个以 开头的文件,cp /tmp/temp temp*
则会创建一个名为 的文件。temp*
temp
最后,如果您希望*
无论何种情况都以不变的方式传递,则可以使用单引号'*'
、双引号"*"
或反斜杠来保护它免于扩展\*
。
答案3
在 Bash 中,shell 会处理这个问题。你会发现,如果你尝试*
不使用 echo
注意-根据一些评论,我建议在运行* ENTER时创建一个目录并使用touch命令创建一些文件,并确保它们都不是路径中任何脚本或命令的名称,或者至少确保按字母顺序排列的第一个文件不是路径中任何脚本或命令的名称。
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
所以ls *
有点陈词滥调
在Windows中,*
都是通过命令来处理的,所以dir *.*
不是老生常谈。
注意 - 看到一些评论,我想补充一点,运行 * 然后按 ENTER 是有风险的。如果您有一个名为 rm 的文件,它是目录列表中的第一个文件,那么它很危险,因为它后面的任何东西都将被删除。此外,这种情况不太可能发生,如果目录列表中的第一个文件是路径中脚本的名称,那么它将运行该脚本。