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 告诉您主要引用是数据的方式,将它们与作为语法存在的引用区分开来。
我在尝试将 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 告诉您主要引用是数据的方式,将它们与作为语法存在的引用区分开来。