Bash:为什么在不匹配的情况下不返回空字符串

Fre*_*son 4 bash

我不明白为什么 * 在没有匹配项时会返回自身。这个答案表明情况确实如此,但我不明白这种行为的基本原理。为什么 * 或任何通用模式在不匹配的情况下不返回空字符串?

$ls      # Look, no files
$touch a # Add a file
$echo *  # Works as expected
a
$rm a    # Remove the file
$echo *  # Will output a '*'. Why not ''?
*
$*       # Ok, * will fail, but how come the previous output?
-bash: *: command not found
$
Run Code Online (Sandbox Code Playgroud)

sou*_*edi 5

与任何文件都不匹配的模式被视为错误。您可以在 UNIX 的第一个版本中看到这一点。

glob会打印错误,并且它传递的命令永远不会运行。

错误消息是“不匹配”

在源自Bourne(Unix 版本 7)的现代 shell 中,ls -l *.c将生成错误“*.c:没有这样的文件或目录”。我想说这个消息更容易理解;它还指示失败的模式。

请注意,如果*.c扩展为空,ls -l *.c则会显示目录中的所有文件,并且不会打印错误。

bash 有一个failglob更接近原始行为的选项。