【问题标题】:bash: Unable to run build commands via bash scriptsbash:无法通过 bash 脚本运行构建命令
【发布时间】:2020-02-20 08:05:14
【问题描述】:

我正在尝试从我的 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 解释变量的问题。

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

【问题讨论】:

  • 看不到您的脚本。添加更多代码,或将代码粘贴到 shellcheck.net 或使用 bash -x build_script ... 运行脚本
  • 嗨,马克,您可以看到命令生成正确吗? for 循环将解析参数并检查 PROJECTS 字符串并生成构建命令。
  • 我看不到足够多的代码来判断问题所在。你在spellcheck.net 上发布了吗?因为,例如这是不正确的make DCOV=1 $makeargs $maketest,因为您没有双引号"$makeargs""$maketest"
  • 不,我之前没有在 speelcheck.net 上发过帖子。我们将它作为构建命令运行,即 make ...。所以没有必要保持双引号正确?
  • 没错,这就是为什么我最初建议在bash -x 下运行并使用shellcheck...

标签: bash shell makefile gnu-make


【解决方案1】:

在将makeargs 字符串作为参数组传递之前将其更改为数组。

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

如果不转换为数组,如果启用调试,它会显示最后一行解释为

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

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

解释:

Word-splitting 它说,

shell扫描参数扩展的结果,命令 代入和算术展开,没有发生在 双引号用于分词。

如果我们使用"$makeargs",即用双引号括起来,则不考虑分词,结果为LIC=1 DOCUMNETS=1 "PROJECTS=cuda bfm"

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

所以现在使用$makeargs

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

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

为什么数组在这里工作?

当使用@ 时,数组本身会将每个元素扩展为单独的单词,并且在扩展后不需要进一步的单词分割。

Arrays

【讨论】:

  • 我可以知道为什么 bash 会这样解释吗?
猜你喜欢
  • 2019-02-22
  • 2016-10-20
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多