如何在命令行中传递存储在文本文件中的make标志?

时间:2019-02-23 21:45:29

标签: shell gnu-make

我有一个名为OPTIONS.txt的文本文件,其中存储了Makefile的所有标志:

arg1=foo arg2="-foo -bar"

我想将此文件中的所有标志传递给make。但是,

make `cat OPTIONS.txt`

make: invalid option -- 'a'失败。似乎Shell将其解释为:

make arg1=foo arg2="-foo -bar"
     ^argv[1] ^argv[2]   ^argv[3]

有什么办法可以将其解释为:

make arg1=foo arg2="-foo -bar"
     ^argv[1] ^--------argv[2]

2 个答案:

答案 0 :(得分:1)

如果您希望shell在反引号扩展后解释引号,则需要使用eval,如下所示:

eval make `cat OPTIONS.txt`

不过,请注意,这会评估所有内容,因此,如果您在引号之外引用内容,则会遇到相同的问题:

eval make `cat OPTIONS.txt` arg4="one two"

将给出错误。您必须将arg4双引号,如下所示:

eval make `cat OPTIONS.txt` arg4='"one two"'

通常,在脚本之外从命令行执行此类操作比较棘手。

ETA

这里的真正问题是我们没有一套要求。 为什么要将它们放入文件中,并添加 些什么?它们是仅makefile变量分配,还是这里还有其他make选项,例如-k或类似的东西?

如果OP控制(可以更改)文件的格式并且文件包含仅由make使用的内容,并且OP不在乎变量是命令行分配还是常规分配,并且仅存在变量分配和不是其他选择,那么它们可以(a)将每个变量赋值放在自己的行上,(b)删除所有引号,并且(c)从makefile内部使用include OPTIONS.txt来“导入”它们。

答案 1 :(得分:1)

由于您控制了选项文件,因此每行存储一个选项:

arg1=foo
arg2="-foo -bar"

然后在外壳中,将文件读入数组,每行一个元素:

readarray -t opts < OPTIONS.txt

现在您可以调用make并使整个选项保持不变:

make "${opts[@]}"