考虑这个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效果?
答案 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命令如何可靠地接收它。