为什么bash文档建议引用通配符



在一些手册中(包括官方的GNU/Linux命令行工具tldp.org)建议使用单引号(或双引号)来避免bash解释通配符或正则表达式符号,如插入符号(^)和美元($)。

但是在一些例子中,不需要使用单/双引号。例如:

(1)

$ touch 'fo*'

$ touch fo*

在两个命令行形式中创建相同的文件fo*

(2)

$ grep '^foo' file.txt

$ grep ^foo file.txt

都在file.txt的行首搜索foo作为字符串。

为什么手册建议使用单/双引号来避免bash解释,如果bash实际上不解释一些通配符和正则表达式符号放在首位?

如果当前目录中有一个名为foo的文件,则touch 'fo*'触摸fo*,但touch fo*会扩展到touch foo并触摸该文件。

如果设置了nullglob选项,并且不存在与fo*匹配的文件名,则touch fo*将扩展为仅touch并抱怨缺少操作数。

如果设置了failglob选项,且不存在与fo*匹配的文件名,则touch fo*会立即导致错误

Bash确实扩展了所有通配符,就像在正确的前提条件下看到的那样。

nullglob :

shopt -q nullglob && ! compgen -G 'f*' >/dev/null && touch f*
touch: missing file operand

nullglob

如果设置,Bash允许不匹配文件的文件名模式扩展为空字符串,而不是它们本身。

failglob :

shopt -q failglob && ! compgen -G 'f*' >/dev/null && touch f*
bash: no match: f*

failglob

如果设置,在文件名扩展过程中匹配文件名失败的模式将导致扩展错误。

最新更新