就在我认为我知道 shell 是如何正常工作的时候,出现了一些让我难过的东西。以下命令在 GNU bash 版本 3.2.25 上执行。
我有几个./configure
脚本,它们都共享一组常见的配置选项,其中一个是CFLAGS
.
为此,我有两个变量
CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"
当它被传递给`./configure'时,它是这样完成的,
"$FOO/configure" $COMMON_CONFIGURE_OPTIONS
对于我的生活,我似乎无法正确扩展它。我已经尝试手动替换$CFLAGS
into的值$COMMON_CONFIGURE_OPTIONS
。我在阳光下尝试了单引号和双引号的所有组合。我什至尝试引用整个“CFLAGS = ...”论点。
我上面给出的版本产生以下(set -x
启用时)
../configure 'CFLAGS="-fPIC' '-O3"' --enable-static --disable-shared --prefix=../install
configure: error: unrecognized option: `-O3"'
Try `../configure --help' for more information
我所期望的,我渴望的,是为了configure
被调用
./configure CFLAGS="-fPIC -O3" --enable-static --disable-shared --prefix="$PREFIX"
我怎样才能实现我想要的,此外,是否有很好的资源/提示可以在未来避免这个问题?
我认为这应该有效:
第二种选择:
这很不对劲,首先是因为 shell 不会继续递归地扩展东西(就像
make
它的宏一样,除非它make
永远不会“取消引用”它们):其次,因为不带引号的变量将与
IFS
(默认为空格)中的字符分开,这不关心引号:你当然可以使用
(注意两个变量两边的双引号),但这会打开另一个蠕虫罐,除非你非常牢记整个解析和扩展机制及其所有怪癖,否则你不应该使用这样的技巧,无意冒犯,你似乎没有。
解决方案是忘记
$COMMON_CONFIGURE_OPTIONS
废话并分别传递所有这些选项: