bash:无法通过 bash 脚本 运行 构建命令

bash: Unable to run build commands via bash scripts

我正在尝试从我的 bash 脚本中 运行 'make' 命令来构建代码。

我可以看到所有参数都已分配并且能够显示我正在尝试的命令 运行。我看不到命令​​有任何问题。但问题是,当它尝试通过 bash 脚本执行 运行 命令时,它失败了。

My command is :- ./build_script LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm"

解析所有参数并构建 make 命令的脚本片段:-

makeargs=""
for build_flag do
   if [[ "$build_flag " = "PROJECTS="* ]]; then
          apps =`echo $build_flag |sed "s/PROJECTS=//" `
          makeargs="$makeargs PROJECTS=\"$apps \""
   else
        makeargs="$makeargs $build_flag"
    fi
done
echo "make DCOV=1 $makeargs $maketest"
make DCOV=1 $makeargs $maketest

当我 运行 脚本时,我可以看到构建命令已正确构建。

输出:-

make DCOV=1 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm" run_all
GNUmakefile:16: warning: overriding commands for target `/'
GNUmakefile:19: warning: ignoring old commands for target `/'
make: *** No rule to make target `bfm"'.  Stop.

我尝试在 build_main 文件夹中的 'GNUmakefile' 中打印 PROJECTS 变量。我可以看到输出: PROJECTS is "bfm 。它没有将整个 "cuda bfm" 作为一个完整的字符串。

注意:- 当我尝试 运行 相同的构建命令时:- make DCOV=1 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm" run_all 明确地工作正常。

似乎与使用 makefile 解释变量有关。

有什么解决办法吗?请帮忙。 谢谢!

makeargs 字符串更改为数组,然后再将其作为参数组传递。

eval makeargs_array=( $makeargs )
make UVC=1 "${makeargs_array[@]}" $maketest

在不转换为数组的情况下,如果启用调试,它会将最后一行解释显示为

make DCOV=1 LIC=1 DOCUMNETS=1 'PROJECTS="cuda' bfm '"'

这显然忽略了双引号并将 space 视为分隔符。 在这种情况下,甚至双引号也作为单独的参数传递。

解释:

Word-splitting 它说,

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

如果我们使用 "$makeargs" 即用双引号括起来,它不会被分词考虑并导致 LIC=1 DOCUMNETS=1 "PROJECTS=cuda bfm"

但它又是一个完整的字符串,而要求是拆分字符串以用作参数。

所以现在使用 $makeargs.

按照默认 IFS(space、制表符、换行符)进行分词,我们得到的结果为 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm "

字符串的双引号部分不影响分词,因为这里要分词的是完整的字符串。

为什么数组在这里起作用?

数组本身在使用 @ 时将每个元素扩展为单独的单词,这里扩展后不需要进一步的单词拆分。

Arrays