谁在回声 * 中处理明星 *

far*_*oft 16 unix bash shell shell-script stdin

谁处理(解释)* in

echo *
Run Code Online (Sandbox Code Playgroud)

回声是否看到星号或外壳会关心它并返回文件名列表..

关于什么

cp temp temp*
Run Code Online (Sandbox Code Playgroud)

Jar*_*und 25

bash(或您用作 shell 的任何东西)是读取任何输入的第一件事,并将开始解释特殊字符,例如?**扩展到CWD 中的任何匹配项,这意味着星号被所述匹配项替换。

在大多数情况下,这是相当直接的,但有时会导致一些令人困惑的情况。

考虑以下。目录具有以下内容:

  • 测试(普通文件)
  • test1(目录)
  • test2(目录)
  • test3(目录)

如果你然后输入mv *一些看似奇怪的东西:test3在那里,但其余的都没有了。虽然一开始很奇怪,但一旦你理解了 bash 实际上传递给mv. 由于星号,bash 解释mv *mv test test1 test2 test3,并且当 mv 获取该列表时,它会假定最后一个参数是目标,即所有文件都将被移动的位置。

至于您列出的命令:

  • echo *可以充当穷人ls。shell 会将星号扩展到该目录中的任何内容,而且我相信您已经知道,它echo实际上只会回显 bash 作为参数传递给它的任何内容。
  • cp temp temp*将有点像mv我上面描述的命令,除非只有一个名为 temp 的目录,在这种情况下,源名称和目标名称相同,即它什么都不做。

  • 使用 `*` 代替 `ls` 并没有什么“糟糕”之处。例如,`for f in *; 如果文件名包含空格或通配符,那么 do` 比 `for f in $(ls)` 更可靠。(但是,如果 CWD 中没有文件,它将失败,因此您确实需要检查这种情况。) (8认同)
  • 至于`echo *`,在某些情况下,这个技巧[可以拯救你](http://www.ee.ryerson.ca/~elf/hack/recovery.html)。 (3认同)
  • 配合:在触发不良开关的任意文件夹中以“-”开头的文件。在您意识到 rm ./-stupidfile 工作之前,删除它们并不是很有趣。 (2认同)

jll*_*gre 5

如前所述,shell 会扩展,*因此echo无论 shell 在当前目录中找到什么,都可以将其作为参数接收。但是,请注意,如果扩展没有结果,即在这种情况下,如果目录不包含非隐藏文件,*则保持不变并按原样传递给调用的命令(除非非标准选项与某些 shell 一起使用,例如bash.)echo *然后不会表现得像一个穷人,ls因为前者不会打印任何内容而后者会打印*.

同样,cp /tmp/temp temp*将创建一个文件名为temp*在当前目录下是否有尚未至少一个文件,该文件名以temp

最后,如果您希望在*任何情况下都保持不变,您可以使用单引号'*'、双引号"*"或反斜杠来保护它免受扩展\*