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

时间:2016-07-01 19:29:53

标签: linux bash wildcard

在几本手册中(包括官方的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实际上并不首先解释某些通配符和正则表达式符号?

2 个答案:

答案 0 :(得分:6)

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

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

如果设置了fo*选项且文件名不匹配touch fo*,则{{1}}会立即导致错误。

答案 1 :(得分:1)

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

     

如果设置,在文件名扩展期间无法匹配文件名的模式会导致扩展错误。