makefile转义问题中的简单回显

时间:2014-04-03 00:31:36

标签: bash shell makefile

这是一个非常简单的问题,但我正在努力弄清楚如何去做。我有一个makefile,在make文件中我有以下行:

echo "java packet.Program $1 $2 $3 $4" > programScript

我的问题是:如何使此行完全打印出引号中的内容?现在,它一直试图将$ 1,$ 2,$ 3,$ 4解释为参数。我希望makefile在运行时能够完全回显“java packet.Program $ 1 $ 2 $ 3 $ 4”char for char。 '$'给了我一个问题。

感谢。

编辑:

澄清问题。当我在终端中键入“echo'java packet.Program $ 1 $ 2 $ 3 $ 4'> programScript”时,它会打印出它应该如何。但是当我将同一行放入我的makefile文件并运行“make”时,它不会在“java packet.Program”之后打印任何内容。

3 个答案:

答案 0 :(得分:3)

make不会尝试解析命令行,因此"$name"'$name'的处理方式相同make;在这两种情况下,$name都将替换为make变量$(name)的值。在任何情况下,shell都不会看到$

如果要在makefile中的命令中插入文字$,则需要编写$$

所以,例如:

show_a_dollar:
        echo '$$a'

show_a_variable:
        echo "$$a"

在第一个make规则中,生成的操作为:

echo '$a'

这将回声,字面意思是$a。在第二个中,结果是

echo "$a"

将回显环境变量a的值。

因此,您需要考虑两个 make扩展规则,这些规则要求您将$加倍到$$,以及shell扩展规则,这些规则需要命令行参数在单引号内:

echo 'java packet.Program $$1 $$2 $$3 $$4' > programScript

答案 1 :(得分:0)

使用$$在Makefile中回显$。 参考: Escaping in makefile

答案 2 :(得分:0)

使用单引号

echo 'java packet.Program $1 $2 $3 $4' > programScript

或者,逃避他们:

echo "java packet.Program \$1 \$2 \$3 \$4" > programScript