如何在要从 bash 执行的 makefile 命令中转义双引号

问题描述 投票:0回答:2

我正在尝试使用 bash 脚本从文本文件执行 make 命令。 make命令有一个带空格的参数,并且它不将参数内容视为一个。在这种情况下如何转义双引号?

$( echo "make -C ... INSTALL_MOD_STRIP="--param-one --param-two=.note.gnu.build-id" ARCH=arm64 ..." )

在这种情况下,在 echo 命令之后不考虑 INSTALL_MOD_STRIP 的双引号,并且 --param-two=.note.gnu.build-id 不被视为此类关键字的一部分。 如何将 INSTALL_MOD_STRIP= 的内容转义为双引号,以便 make 命令将其视为一?

bash makefile
2个回答
1
投票

我真的不明白你想在这里做什么。写

$(echo foo)
的目的是什么?为什么不直接写
foo
呢?

无论如何,双引号从你的表达式中消失的原因是:

echo "make -C ... INSTALL_MOD_STRIP="--param-one --param-two=.note.gnu.build-id" ARCH=arm64 ..."

是因为引号不嵌套(解析器怎么知道要这样做?)上面的内容被 shell 解析为以下单词:

echo
,然后是前两个引号之间的内容:
make -C ... INSTALL_MOD_STRIP=
,然后是不带引号的单词
--param-one
--param-two=.note.gnu.build-id
,然后是后两个引号之间的内容:
ARCH=arm64 ...

如果你想嵌套引号,你必须转义内部引号:

echo "make -C ... INSTALL_MOD_STRIP=\"--param-one --param-two=.note.gnu.build-id\" ARCH=arm64 ..."

或者更好的是,使用单引号作为外引号(如果内部内容没有任何变量)或内引号(如果内容确实有变量):

echo "make -C ... INSTALL_MOD_STRIP='--param-one --param-two=.note.gnu.build-id' ARCH=arm64 ..."

0
投票

很难看出你能建立什么,但我有时想要的是,例如将使用的编译器标志记录在一个文件中,我可以将其与构建一起使用。如果 CFLAGS 包含诸如以下项目: -DFOO="bar" 我只是在生成字符串之前调用文本替换函数。

以下 GNU Makefile 片段中的示例。

cflags.c: Makefile
  echo "const char * cflags=\"$(subst \",',$(CFLAGS))\";" > $@

用单引号巧妙地替换双引号,以便它可以嵌套。

© www.soinside.com 2019 - 2024. All rights reserved.