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
"
字符串的双引号部分不影响分词,因为这里要分词的是完整的字符串。
为什么数组在这里起作用?
数组本身在使用 @
时将每个元素扩展为单独的单词,这里扩展后不需要进一步的单词拆分。
我正在尝试从我的 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
"
字符串的双引号部分不影响分词,因为这里要分词的是完整的字符串。
为什么数组在这里起作用?
数组本身在使用 @
时将每个元素扩展为单独的单词,这里扩展后不需要进一步的单词拆分。