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 中的任何匹配项,这意味着星号被所述匹配项替换。
在大多数情况下,这是相当直接的,但有时会导致一些令人困惑的情况。
考虑以下。目录具有以下内容:
如果你然后输入mv *一些看似奇怪的东西:test3在那里,但其余的都没有了。虽然一开始很奇怪,但一旦你理解了 bash 实际上传递给mv. 由于星号,bash 解释mv *为mv test test1 test2 test3,并且当 mv 获取该列表时,它会假定最后一个参数是目标,即所有文件都将被移动的位置。
至于您列出的命令:
echo *可以充当穷人ls。shell 会将星号扩展到该目录中的任何内容,而且我相信您已经知道,它echo实际上只会回显 bash 作为参数传递给它的任何内容。cp temp temp*将有点像mv我上面描述的命令,除非只有一个名为 temp 的目录,在这种情况下,源名称和目标名称相同,即它什么都不做。如前所述,shell 会扩展,*因此echo无论 shell 在当前目录中找到什么,都可以将其作为参数接收。但是,请注意,如果扩展没有结果,即在这种情况下,如果目录不包含非隐藏文件,*则保持不变并按原样传递给调用的命令(除非非标准选项与某些 shell 一起使用,例如bash.)echo *然后不会表现得像一个穷人,ls因为前者不会打印任何内容而后者会打印*.
同样,cp /tmp/temp temp*将创建一个文件名为temp*在当前目录下是否有尚未至少一个文件,该文件名以temp。
最后,如果您希望在*任何情况下都保持不变,您可以使用单引号'*'、双引号"*"或反斜杠来保护它免受扩展\*。