我有一个名为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]
答案 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[@]}"