我偶尔看到人们用单引号括住占位符({}
(。这可能是因为它在GNUfind
手册中被用作一个例子。
find . -type f -exec file '{}' ;
对当前目录内或目录下的每个文件运行"file"。请注意,大括号括在单引号中,以防止它们被解释为 shell 脚本标点符号。 分号同样受到反斜杠的保护,尽管在这种情况下也可以使用单引号。
包含<space>
、<newline>
、<tab>
、|
、&
、;
、<
、>
、(
、)
、$
、`
、、
"
、'
、*
、?
、[
、#
、~
、=
、%
、{
和}
的文件名在GNU和FreeBSDfind
上都可以正确处理, 无论占位符是否用单引号括起来。
GNUfind
手册中显示的示例是货物崇拜编程的案例吗?单引号占位符是否涵盖了我不知道的一些边缘情况,还是浪费引号?
在 GNUfind
手册页的EXAMPLES
部分,可以找到以下句子:
find . -type f -exec file '{}' ;
对当前目录内或目录下的每个文件运行"file"。请注意,大括号括在单引号中,以防止它们被解释为 shell 脚本标点符号。分号同样受到反斜杠的保护,尽管在这种情况下也可以使用单引号。
我想不出一个不带引号的{}
破坏-exec
命令的例子,即使文件名中有空格或控制字符。
但是,如果将字符串附加到文件名,则可能需要引用表达式(如果该字符串可以由 shell 解释(。
例如,在以下情况下,在文件名前面添加$
会中断:
find . -type f -exec echo ${} ;
而如果引用表达式,它不会中断":
find . -type f -exec echo '${}' ;
只要您使用符合 POSIX 的 shell,就没有理由引用占位符 ({}
(。如果您使用的是鱼或 rc 壳,则需要引用占位符以防止膨胀。据称,可能存在某些非现代的 csh 变体需要引用占位符。在Unix和Linux上查看这个问题的精彩答案,它们比我所能做的更公正。