*
我认为命令中的通配符find . -name *foo*
被 bash 替换,但该命令有效,除非与*foo*
当前目录中的某些内容匹配,否则它不会。这很令人困惑。
答案1
如果 bash 找不到匹配项,它会将文字字符串传递给应用程序,并且*
s 未展开。例如:
$ ls
foo
$ cat /tmp/test
echo $1
$ /tmp/test *foo*
foo
$ /tmp/test *bar*
*bar*
bash
*foo*
因为匹配而扩展,但*bar*
因为不匹配而直接通过。该nullglob
选项将告诉 bash 将不匹配的模式解析为空字符串:
$ shopt -s nullglob
$ /tmp/test *bar*
$
答案2
如果您想find
获取未扩展的字符串,那么您可以用引号引起来或者用反斜杠保护通配符。
$ ls
foo
$ cat /tmp/test
echo $1
$ /tmp/test '*foo*'
*foo*
$ /tmp/test \*foo\*
*foo*