代码之家  ›  专栏  ›  技术社区  ›  lz96

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

  •  0
  • lz96  · 技术社区  · 7 年前

    我有一个名为“选项”的文本文件。txt存储Makefile的所有标志:

    arg1=foo arg2="-foo -bar"
    

    我想将此文件中的所有标志传递给 make 然而

    make `cat OPTIONS.txt`
    

    失败于 make: invalid option -- 'a' .壳牌似乎将其解释为:

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

    有没有办法将其解释为:

    make arg1=foo arg2="-foo -bar"
         ^argv[1] ^--------argv[2]
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   glenn jackman    7 年前

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

    arg1=foo
    arg2="-foo -bar"
    

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

    readarray -t opts < OPTIONS.txt
    

    现在,您可以调用make并保持选项完整:

    make "${opts[@]}"
    
        2
  •  1
  •   MadScientist    7 年前

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

    eval make `cat OPTIONS.txt`
    

    不过,请注意,这会评估所有内容,因此,如果你引用了背景之外的内容,你会遇到同样的问题:

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

    将给出一个错误。你得把报价加倍 arg4 ,大致如下:

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

    一般来说,在脚本之外,从命令行执行类似的操作是很棘手的。

    希腊字母表的第7个字母

    这里真正的问题是我们没有一套要求。 为什么? 你想把这些文件归档吗 什么 你在添加什么东西;它们只是makefile变量赋值,还是这里还有其他make选项,比如 -k 还是类似的?

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