bash 参数扩展作为命令的参数

bash parameter expansion as arguments to command

我在尝试将 bash 参数作为参数传递给 find 时遇到困难。

最好通过代码解释:

$ echo $BASH_VERSION
4.1.2(1)-release

$ find /etc -path '*/init.d' 2>/dev/null | wc -l
2

$ args="-path '*/init.d'"
$ echo $args
-path '*/init.d'
$ find /etc $args 2>/dev/null | wc -l
0

$ set -x; !!
set -x; find /etc $args 2>/dev/null | wc -l
+ wc -l
+ find /etc -path ''\''*/init.d'\'''
0

set -x 输出中额外的 '' 引号来自哪里?

我已经尝试了很多不同的方法来让它工作,但到目前为止还没有成功。本指南似乎表明这应该是可能的,因为参数扩展发生在命令执行之前:http://stuff.lhunath.com/parser.png

使用数组:

args=( -path '*/init.d' )
find /etc "${args[@]}"

BashFAQ #50 中详细讨论了另一种方法不起作用的原因。简而言之:在语法分析期间处理引号字符——before参数扩展发生。因此,当引号字符来自 来自 参数扩展时,它们不会被解析为语法,而是被视为任何其他数据:运行 通过字符串拆分和 glob 扩展,并通过直到程序 运行.

set -x 输出中的额外 quotes/escaping 正是 shell 告诉您主要引用是数据的方式,将它们与作为语法存在的引用区分开来。