IsoPlot(dose, y=express[56,], type="ordinal", add.curve=TRUE)
# White rectangle to cover default title
rect(0, 11, 10, 15, xpd=TRUE, col="white", border="white")
# New title
title(paste("Gene:", row.names(express[56,])))
我已经制作了cmd=python sol.py
A:
@$(cmd)
.PHONY: disp
disp:
python sol.py
EXIT_STAtus=$$? \
ifeq ($EXIT_STAtus,1) \
@echo "GG"; \
exit 1; \
else \
@echo "ALL GOOD"; \
endif
这样的类型,makefile
循环和退出都可以正常工作,但回声不会发生在任何一个部分。
你能说出原因吗?
答案 0 :(得分:3)
您感到困惑和误解make
所以请花几个小时阅读documentation of GNU make,以及Unix shell的文档,可能是GNU bash。请理解make
时间内发生的情况以及make
食谱中发生的情况(操作由您的shell解释,而不是make
解释;该shell 运行 make
)。
ifeq
是一个很少有用的conditional make
construct,代表“解析”时间(当make
程序正在阅读您的Makefile
时)。它在某种程度上类似于C代码中的#if
,因为它要求make
跳过某些输入。您不应该在您的情况下使用ifeq
,或者您希望在运行时(make
)更改行为。
您可能需要条件shell命令。阅读bash
中的conditional shell constructs(他们使用if
,一个shell关键字)。另请阅读shell命令中test(1)的文档,通常缩写为[
,并注意它也是bash builtin。
作为triplee注释,在您的情况下甚至不需要任何条件shell命令。我认为错误消息应该由您的Python脚本输出,并且它们应该是相关的(因此您将更好地改进sol.py
脚本)。
在Makefile
中,它应该是一个命令,因为Makefile
中的不同shell命令不会通信,并且由make
独立运行。阅读make
文档的using one shell部分。
我猜你可能想要
disp:
python sol.py; \
EXIT_STAtus=$$? ; \
if [ "$$EXIT_STAtus" -eq 1 ]; then \
echo "GG"; \
exit 1; \
else \
echo "ALL GOOD"; \
endif
请注意,您执行单个 shell命令(从上面的python
到endif
),因此除了最后一行之外,您需要在每行末尾添加反斜杠。
您可能希望使用make --trace
运行make -n
(和/或-x
)甚至remake
来了解正在发生的事情并调试Makefile
你绝对应该花更多的时间阅读文档。
顺便说一句,你为什么不改变你的sol.py
Python脚本来输出GG
或ALL GOOD
?它可能是一个更简单的解决方案,我实际上建议这样做,并有一个bettersol.py
Python脚本。那么您的Makefile
规则应该更加简单:
disp:
python bettersol.py
此外,在调试Makefile
时,您应首先删除所有@
以了解正在发生的事情。
根据经验,请避免在@
中使用Makefile
。一般情况下, make
应该详细运行。作为初学者,您永远不应该使用@
。稍后您可能有时在少数规则中添加@
(但我不建议这样做)。
注意:您make
的第一个A:
规则也非常糟糕(或者至少是丑陋且闻起来很糟糕)。您可能应该至少删除@
,如果A
是sol.py
的输出,那么您最好提高sol.py
以使显式 ,或许你的第一个食谱中有python sol.py > $@
。