安全地将Make变量传递给shell命令

时间:2015-04-27 21:47:58

标签: shell makefile escaping quoting

考虑这个Makefile:

VAR1=oneword
VAR2=two words
VAR3=three" quoted "words

test:
    printf '>%s< ' "$(VAR1)" "$(VAR2)" "$(VAR3)"
    @echo

如果我运行它,我会

$ make test
printf '>%s< ' "oneword" "two words" "three" quoted "words"
>oneword< >two words< >three< >quoted< >words< print

但是我希望得到与运行以下命令相同的结果:

$ printf '>%s< ' "oneword" "two words" "three\" quoted \"words"
>oneword< >two words< >three" quoted "words<

假设我无法更改变量,即我必须以某种方式将调用更改为printf

换句话说:如何将Make变量的内容作为一个参数传递给shell命令,而不会分裂成几个或任何特定的shell效果?

2 个答案:

答案 0 :(得分:2)

支持export指令以通过环境传递文字内容:

VAR1=oneword
VAR2=two words
VAR3=three" quoted "words

export VAR1
export VAR2
export VAR3

test:
        printf '>%s< ' "$$VAR1" "$$VAR2" "$$VAR3"
        echo

输出:

$ make test
printf '>%s< ' "$VAR1" "$VAR2" "$VAR3"
>oneword< >two words< >three" quoted "words< echo

答案 1 :(得分:1)

我找到了解决方案。它的可读性并不高,但似乎非常可靠。

这个想法是在shell级别使用单引号('),因为那里不会发生变量插值或其他奇怪的事情。此外,它意味着我们需要在变量内容中担心的唯一字符是单引号,并且可以可靠地替换它们:

VAR1=oneword
VAR2=two words
VAR3=three" quoted 'words

test:
    printf '>%s< ' '$(subst ','\\'',$(VAR1))' '$(subst ','\\'',$(VAR2))' '$(subst ','\'',$(VAR3))'
    @echo

现在我得到了

$ make test
printf '>%s< ' 'oneword' 'two words' 'three" quoted '\''words'
>oneword< >two words< >three" quoted 'words< 

请注意make如何正确转义',以及shell命令如何可靠地接收它。