[英]Why does glob='*'; echo “$glob” write only a '*', and not a list of files?
我的问题是关于外壳和球的问题。
当做类似的事情时:
myglob=*
echo $myglob
我得到目录的文件列表,这样就可以了
但是当我做一个:
myglob=*
echo "$myglob"
*
我得到的是*而不是目录中的文件。 我不明白,shell不会将*传递给echo命令吗?
从bash手册页的双引号中 :
将字符括在双引号('“')中可保留引号内所有字符的字面值,但'$','`','\\'除外,并且在启用历史记录扩展功能时,会使用'!'。
第二条命令的计算结果为:
echo "*"
根据链接,它不会扩展。
外壳程序是否将*传递给echo命令?
是的,就是这个问题。
echo
只是写出您通过它。 如果通过*
,它将始终只写出*
。
当你做
myglob=*
echo $myglob
巴什没有通过*
。
取而代之的是,bash首先扩展glob,并将命令本质上重写为echo file1 file2 file3 file4...
毫不奇怪, echo
然后写入file1 file2 file3 file4...
外壳程序是否将*传递给echo命令?
是的,当它用引号引起来时。 文件名扩展globbing是由外壳程序在行扫描期间完成的(不是echo
命令),但是当模式在引号内时则不行。
set -x
( xtrace
)是您的朋友,它显示了扩展及其发生的时间(前导+
是xtrace
提示符PS4
):
set -x
myglob=*
echo $myglob
得到:
+ myglob='*'
+ echo ... filenames in the current directory ...
您可以看到*
的扩展是在调用echo
之前完成的。
鉴于:
set -x
myglob=*
echo "$myglob"
得到:
+ myglob='*'
+ echo '*'
*
在这里您可以看到没有扩展,这是使用引号的一个原因(还有其他原因)。
set +x
将关闭xtrace
功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.