我看到一个看起来像的Makefile:
TESTTMP = ./test-tmp
# VANILLA REDIS CONF
define VANILLA_CONF
daemonize yes
port 6379
dir .
pidfile redis_vanilla.pid
logfile redis_vanilla.log
save ""
appendonly no
endef
export VANILLA_CONF
.ONESHELL: # what's it used for?
start: cleanup
mkdir -p $(TESTTMP)
cd $(TESTTMP)
echo "$$VANILLA_CONF" | redis-server - # what does this look like when expanded, equivalent to what command?
cleanup:
rm -rf $(TESTTMP)
stop:
kill `cat $(TESTTMP)/redis_vanilla.pid` || true # what's "|| true"
make cleanup
基本上我需要修改它以供我自己使用,但有一些我不太了解的行。我在代码中发表了评论。任何帮助,将不胜感激。感谢。
答案 0 :(得分:3)
如果您想查看echo $$VANILLA_CONF
的输出,只需删除| redis-server -
,输出就会显示在屏幕上。
在这一行中,$
被加倍作为在Makefile中“转义”它的方法:Make将echo $$VANILLA_CONF
扩展为echo $VANILLA_CONF
,并将其传递给shell,扩展 shell 变量VANILLA_CONF
(在此上下文中常见的错误是忘记加倍$
符号:如果该行代替echo $VANILLA_CONF
,那么Make会尝试扩展 makefile 变量V
,该变量未定义,将扩展为空,shell将收到令人困惑的字符串echo ANILLA_CONF
。
| redis-server -
只是标准shell语法,表示pipeline:echo
命令回显到管道中的文本由程序standard input读取wikipedia page {1}}(不管是什么)。
redis-server
shell连接器的意思是'或':如果(且仅当)||
之前的命令失败,则执行后的命令。在这种情况下,||
之后的命令是||
,它始终成功。也就是说,即使true
失败,stop
规则中的这一行也会成功(还有其他方法可以在Makefile语法中表达这一点,但我认为这更清楚)。这也是标准的shell语法。
这看起来有点令人困惑,因为您必须能够识别什么是 make 语法以及什么是 shell 语法。使用'make'的基本思想是,在使用kill
(或$(varname)
扩展 make 变量之后,它将每个'规则'行发送到shell进程(罕见) )单字母变量$x
和各种转义,例如x
$$
,如上所述)。您可能希望查看“make”的文档(似乎有足够的详细信息来涵盖您需要的内容,但如果需要,则链接到更广泛的手册。)