为什么glob ='*';回声“ $ glob”只写一个“ *”,而不是文件列表?

时间:2019-07-01 20:44:54

标签: bash shell

我的问题是关于外壳和水珠的问题。

在执行类似操作时:

myglob=*
echo $myglob

我得到了目录的文件列表,所以没关系

但是当我做一个:

myglob=*
echo "$myglob"
*

我得到的是*而不是目录中的文件。 我不明白,shell不会将*传递给echo命令吗?

3 个答案:

答案 0 :(得分:1)

来自the bash manual page on double quotes

  

用双引号('“')引起来的字符将保留引号中所有字符的文字值,但'$','`','\'除外,并且在启用历史记录扩展功能时,'! '。


第二条命令的计算结果为:

echo "*"

根据链接,该链接不会展开。

答案 1 :(得分:1)

  

shell是否将*传递给echo命令?

是的,就是这个问题。

echo只会写出您通过的内容。如果您将其传递给*,它将始终只写出*

完成时

myglob=*
echo $myglob

Bash 通过*

相反,bash首先扩展了glob,实际上将命令重写为echo file1 file2 file3 file4...。毫不奇怪,echo然后写file1 file2 file3 file4...

答案 2 :(得分:1)

shell是否将*传递给echo命令?

是的,当它用引号引起来时。文件名扩展 globbing 是由外壳程序在行扫描期间完成的(不是echo命令),但是当模式在引号内时则不会。

set -xxtrace)是您的朋友,它显示了扩展及其发生的时间(前导+xtrace提示符,PS4) :

set -x
myglob=*
echo $myglob

礼物:

+ myglob='*'
+ echo ... filenames in the current directory ...

您可以看到在调用{em> *之前已完成echo的扩展。

位置:

set -x
myglob=*
echo "$myglob"

礼物:

+ myglob='*'
+ echo '*'
*

在这里您可以看到没有扩展,这是使用引号的一个原因(还有其他原因)。

set +x将关闭xtrace功能。