Answers:
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目录,在这种情况下,源和目的地的名称是相同的命令,也就是说,它会做什么。*
代替没有什么“可怜的” ls
。例如,for f in *; do
是更比可靠for f in $(ls)
如果文件名中包含空白或水珠字符。(但是,如果CWD中没有文件,它将失败,因此您需要检查这种情况。)
shopt nullglob
。
如前所述,shell进行了扩展,*
因此echo
无论shell在当前目录中找到什么内容,都将其作为参数接收。但是,请注意,如果扩展没有结果,即在这种情况下,如果目录中不包含任何非隐藏文件,则将*
其保留不变,并按原样传递给所调用的命令(除非非标准选项与.shell一起使用bash
)。echo *
那样就不会表现得像一个穷人,ls
因为前者什么都不打印,而后者则打印*
。
同样,如果还没有至少一个名称开头cp /tmp/temp temp*
的文件,则将temp*
在当前目录中创建一个名为的文件temp
。
最后,如果您希望在*
任何情况下均不传递,则可以使用单引号'*'
,双引号"*"
或反斜杠保护其免受扩展\*
。
在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的文件,那么这很危险,因为它之后的所有内容都会被删除。同样,这不太可能,如果目录列表中的第一个文件是路径中脚本的名称,则它将运行该文件。
rm
,当然会有一个名为的文件。
-rf
吗?我试过了touch -rf
,touch \-rf
但它没有创造出来。
-rf
?(我知道有一个名为rm的文件和一个名为-rf的文件的危险,以及在重要文件夹中键入*并按Enter的问题,我不打算这样做)
在将参数传递给命令之前,shell会执行几次扩展 。
另请参阅https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
不特定于bash,请参阅http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01