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

时间:2015-01-23 17:28:45

标签: bash shell unix

我在尝试将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

1 个答案:

答案 0 :(得分:4)

使用数组:

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

BashFAQ #50详细讨论了其他方法不起作用的原因。简而言之:引用字符在语法分析期间处理 - 参数扩展之前。因此,当引用字符来自 参数扩展时,它们不会被解析为语法,而是被视为任何其他数据:通过字符串拆分和glob扩展运行,并传递给正在运行的程序。

set -x输出中的额外引号/转义只是shell告诉您主要引号是数据的方式,将它们与作为语法出现的引号区分开来。