在一些手册中(包括官方的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
如果设置,在文件名扩展过程中匹配文件名失败的模式将导致扩展错误。