gpt4 book ai didi

bash - b2 命令在直接调用而不是从间接 bash 脚本变量调用时查找 ICU

转载 作者:行者123 更新时间:2023-11-29 09:05:49 26 4
gpt4 key购买 nike

我的 bash 脚本有这个奇怪的问题。我将 boost 编译为其中的一部分。来自脚本的调用如下所示:

./b2 --reconfigure ${PARALLEL} link=static cxxflags=-fPIC install boost.locale.iconv=off boost.locale.posix=off -sICU_PATH="${ICU_PREFIX}" -sICU_LINK="${BOOST_ICU_LIBS}" >> "${BOOST_LOG}" 2>&1

该命令运行良好。日志文件显示它可以毫无问题地找到 ICU。但是,如果我将其更改为从变量运行,它将不再找到 ICU(但它仍会编译其他所有内容):

bcmd="./b2 --reconfigure ${PARALLEL} link=static cxxflags=-fPIC install boost.locale.iconv=off boost.locale.posix=off -sICU_PATH=\"${ICU_PREFIX}\" -sICU_LINK=\"${BOOST_ICU_LIBS}\""
$bcmd >> "${BOOST_LOG}" 2>&1

有什么区别?我希望能够使用第二种方法,以便在运行命令之前将命令传递给另一个函数。

最佳答案

不要使用变量来存储涉及嵌套引号的复杂命令。问题是当您仅使用 $cmd 调用变量时,引号被错误地去除。将命令(或命令的一部分)放入变量然后将它们原封不动地取回是很复杂的。

引号删除是 shell 完成的单词扩展之一的一部分。来自 POSIX 中的摘录外壳规范

2.6.7 Quote Removal

The quote characters ( backslash, single-quote, and double-quote) that were present in the original word shall be removed unless they have themselves been quoted.

你的例子可以通过一个简单的例子简单地重现。假设您有一些命令标志(不是实际的)

cmdFlags='--archive --exclude="foo bar.txt"'

如果仔细查看上面的内容,它包含 2 个参数,一个是 --archive,另一个是 --exclude="foo bar.txt",请注意传递时需要保留的双引号。

请注意,在下面的 printf() 调用中,当我不引用 cmdFlags 时,引号是如何被错误分割的

printf "'%s' " $cmdFlags; printf '\n'
'--archive' '--exclude="foo' 'bar.txt"'

并将结果与​​下面正确引用的结果进行比较。

printf "'%s' " "$cmdFlags"; printf '\n'
'--archive --exclude="foo bar.txt"'

因此除了正确引用变量的建议外,一般建议是使用数组来存储标志并传递引用的数组扩展

cmdArray=()
cmdArray=(./b2 --reconfigure ${PARALLEL} link=static cxxflags=-fPIC install boost.locale.iconv=off boost.locale.posix=off -sICU_PATH="${ICU_PREFIX}" -sICU_LINK="${BOOST_ICU_LIBS}")

并将数组作为

传递
"${cmdArrray[@]}" >> "${BOOST_LOG}" 2>&1

关于bash - b2 命令在直接调用而不是从间接 bash 脚本变量调用时查找 ICU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53214510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com