我有一个脚本可以驱动很多包的安装。在一个地方,它使用pip。其中一个包在构建过程中需要它自己的特殊命令行参数。在
pip允许将安装选项传递到生成过程,如下所示:
pip install-U--timeout 30$options--install option='--hdf5=/usr/local/hdf5'表
--install选项是pip的一个参数。它设置的值,--hdf5=/usr/local/hdf5将传递给生成过程。所以,单引号必须在那里,把所有的文本组合成一个跟在等号后面的参数。您可能会说我可以用双引号括住install选项的值。好吧,在命令行我可以。在
但是,这里有一个额外的复杂性。这是一个剧本。pip命令的参数值传递给数组中的函数。此包的数组项如下:
(“tables,pip,,--install option='--hdf5=/usr/local/hdf5'”)
接收函数解析此片段中设置为的数组项:IFS="," # to split apart the pkg array entries
for pkg in "${pkglist[@]}"; do
set -- ${pkg}
if [[ "$2" == "pip" ]]; then # $1 is pkg, $2 is pip, $3 is url, $4 is options
DoPip $1 $3 $4
...
因此,对于这个包,DoPip看到了:DoPip表“”--install option='--hdf5=/usr/local/hdf5'
问题发生在DoPip中。当我需要运行pip时,我不知道如何扩展最后一个参数。我做了一堆调试,看看会发生什么。所发生的是,3美元的价值只是被丢弃了——它就消失了。它将在一个字符串中回显,但不能作为命令的一部分工作。在
看看函数DoPip。为了帮助调试,我将参数重新分配给显式变量。这没必要,但有助于确保我没有愚蠢的错误。在
^{pr2}$
接下来,我将变量源设置为pkgname或url(如果url非空)。我跳过这个片段--它起作用了。在
为了调试,我回显重新分配的参数:echo "1. The inbound arguments are: $pkgname $url $options"
输出看起来应该有用:入站参数是:tables--install option='--hdf5=/usr/local/hdf5'
下面是实际运行pip的语句,其中包含以下参数:pip install -U --timeout 30 $options $source
启用调试后,下面是Bash实际看到和运行的内容:+ pip install -U --timeout 30 tables
哇!$options怎么了?它不见了!事实上,在这个语句之前,我重复了echo,以验证脚本中没有任何干预部分导致值被刷新。没问题。我可以在前面立即回显$options的值——没关系。然后,它就不见了。在
我不知道发生了什么,也不知道该怎么做。我尝试过各种方法来转义数组中的单引号,字符串文本最初是根据单引号的特殊性来创建的。什么都不管用。整个变量膨胀就这样消失了。在
我试过用不同的方法进行扩展:pip install -U --timeout 30 "$options" $source
那不管用。选项中的字符串出现,但被单引号包围,因此pip命令抛出错误。接下来,我尝试了:pip install -=U --timeout 30 "${options}" $source
也失败了:单引号和大括号出现了,皮普又不高兴了。在
--install options参数是必需的。没有它,生成将失败。在
一定有办法的。有什么建议吗?在