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

将命令输出保存到makefile变量时如何保留空白?

  •  3
  • sffc  · 技术社区  · 6 年前

    我知道这样的问题 this one 但我的问题是关于makefile,特别是gnumake。

    我有一个命令,可以打印换行符和其他空白以标准输出。我想将该输出捕获到一个变量中,然后将该变量打印到一个文件中。

    makefile示例:

    OUTPUT=${shell cowsay hello}
    
    all:
        @echo "$(OUTPUT)" > output.txt
    

    运行make后,output.txt包含:

     _______  < hello >  -------          \   ^__^          \  (oo)\_______             (__)\       )\/\                 ||----w |                 ||     ||
    

    我希望它保留空白,而不是包含:

     _______
    < hello >
     -------
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
    

    我实际使用的命令不是cowsay,但它输出类似的空白和换行符。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Joseph Quinsey Taseen    6 年前

    不幸的是,这是一个否定的答案。这个 GNU Make Manual states (增加了重点):

    这个 shell 函数执行的函数与反引号在大多数shell中执行的函数相同:它执行 命令扩展 . 这意味着它将一个shell命令作为参数,并对该命令的输出进行计算。唯一的处理 make 做对结果是 将每个换行符(或回车符/换行符对)转换为单个空格 . 如果有一个尾随(回车和换行),它将被简单地删除。

    我不这么认为 eval define 会有帮助的。

    我唯一能看到的就是 cowsay hello 命令 在变量中,而不是命令的输出中,如:

    OUTPUT=$$(seq 5)     # seq 5 replaces cowsay hello
    
    all:
        @echo "$(OUTPUT)" > output.txt
    

    如果 考赛你好 计算起来很贵,或者有副作用。第二个解决方法是保持输出,但用任意字符替换换行符,例如使用 sed ,然后添加换行符。例如:

    OUTPUT=$(shell seq 5 | sed s/$$/xxx/)            # add xxx to the end of each line
    
    all:
        @echo -n $(OUTPUT) ' ' | sed 's/xxx /\n/g'   # replace xxx-space with line break
    
        2
  •  2
  •   Reinier Torenbeek    6 年前

    我想将输出捕获到一个变量中,然后打印 变量到文件。

    似乎没有办法 make 将shell命令输出中的换行符转换为空格的机制。有一点接近你最初的方法,就是让shell把换行符转换成一些不常见的字符(比如 \1 )将输出分配给变量,然后在 echo -将该变量保存到文件中。像这样:

    OUTPUT=$(shell cowsay hello | tr '\n' '\1')
    
    all:
            @echo "$(OUTPUT)" | tr '\1' '\n' > output.txt
    

    对我来说,这会导致

    $ make
    $ cat output.txt 
     _______ 
    < hello >
     ------- 
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
    
        3
  •  0
  •   bobbogo    6 年前

    自从 $(shell) 去掉换行符,用另一个字符或模式替换它们。一旦回来 制作 ,用换行符替换该字符。

    在这里我选择 : 作为我的换人。牛传染性胃肠炎病毒

    define \n
    
    
    endef
    
    cow := $(subst :,${\n},$(shell cowsay hello | tr \\n :))
    
    $(error [${cow}])
    

    $ make
    Makefile:7: *** [ _______
    < hello >
     -------
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
    ].  Stop.
    

    你会发现很难使用 ${cow} 但是在食谱里!