谁处理星星*回声*


15

谁处理(解释)*中的

echo *

回声是否看到星星或外壳好好处理并返回文件名列表。

关于什么

cp temp temp*

14
它会有所不同。Unix shell还是Windows shell?
user1686'4

@grawity Unix外壳。抱歉,我没有提到。
faressoft

对于Unix,以下答案是正确的。(在Windows上,这是由单个程序完成的-尽管通常是由运行时库在main()之前自动执行的。)
user1686

Answers:


24

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目录,在这种情况下,源和目的地的名称是相同的命令,也就是说,它会做什么。

8
使用*代替没有什么“可怜的” ls。例如,for f in *; do比可靠for f in $(ls)如果文件名中包含空白或水珠字符。(但是,如果CWD中没有文件,它将失败,因此您需要检查这种情况。)
rici 2015年

1
@rici就是这样shopt nullglob
CVn 2015年

3
至于echo *,这种技巧在某些情况下可以节省您的时间。
CVn 2015年

2
配合使用:在任意文件夹中以“-”开头的文件会触发不良的切换。除非您意识到rm ./-stupidfile起作用,否则删除它们并不有趣。
ǝɲǝɲbρɯͽ

1
@ǝɲǝɲbρɯͽ我注意到,当我一次需要删除包含文件名的文件的目录的内容时,该文件名表示坐标系中的位置,从-1024x-1024到1024x1024。那是我第一次了解转义的时间。
Jarmund

5

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

同样,如果还没有至少一个名称开头cp /tmp/temp temp*的文件,则将temp*在当前目录中创建一个名为的文件temp

最后,如果您希望在*任何情况下均不传递,则可以使用单引号'*',双引号"*"或反斜杠保护其免受扩展\*


4

在Bash中,shell处理它。您会发现,即使您尝试*不回声

注意-基于一些注释,我建议在运行* ENTER时创建目录并使用touch命令制作一些文件,并确保其中一个都不是,或者至少确保第一个不是字母名称路径中任何脚本或命令的名称。

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

所以ls *有点陈词滥调的

在Windows中,*由命令处理,因此dir *.*不是陈词滥调。

注意-我会补充说,看到一些评论,则可能会出现*然后按ENTER键的风险。如果您在目录列表中首先有一个名为rm的文件,那么这很危险,因为它之后的所有内容都会被删除。同样,这不太可能,如果目录列表中的第一个文件是路径中脚本的名称,则它将运行该文件。


4
请注意rm,当然会有一个名为的文件。
Volker Siegel

1
...和另一个名为-rf
ǝɲǝɲbρɯͽ

1
@ǝɲǝɲbρɯͽ您可以拥有一个文件名为的文件-rf吗?我试过了touch -rftouch \-rf但它没有创造出来。
barlop 2015年

我在上面评论的@barlop; gui(如gedit)可以很好地处理它们,但是由于shell(至少是bash)将其传递通过它,因此需要在前面加上./。如果您不小心创建了这样的文件,则rm会尝试提示,但如果没有这样做,则:我希望该文件最终只能保存在带有可弃孩子的临时文件夹中。
ǝɲǝɲbρɯͽ

@ǝɲǝɲbρɯͽ我根本不明白您的意思,我在问您如何创建一个名为的文件-rf?(我知道有一个名为rm的文件和一个名为-rf的文件的危险,以及在重要文件夹中键入*并按Enter的问题,我不打算这样做)
barlop 2015年

-1

从技术上讲,您所写的内容是正确的,但是没有链接,此答案实际上并不能解决任何问题。考虑纳入相关细节。
CVn 2015年

@MichaelKjörling我同意有关链接的观点,但是OP仅询问外壳程序还是命令本身处理了参数。Glenn的答案只是声明外壳程序可以处理它们,因此这是该问题的可接受答案。
slhck 2015年

@slhck这就是为什么我没有将其标记为NAA的原因:删除链接后,仍有一些问题可以解决。我认为这并不意味着这是一个很好的答案。(我现在看到我的最初评论可以用其他方式解释;为此,我深表歉意,但我仍然认为它具有足够的价值,可以将其保留在原处。)
CVn 2015年

@MichaelKjörling同意。我刚刚离开的注释为那些谁(也会)其标记为NAA。
slhck 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.