这是一个非常简单的问题,但我正在努力弄清楚如何去做。我有一个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”之后打印任何内容。
答案 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