Shell I';如果没有';t从python代码中选择正确的退出状态
我制作了一个这样的Shell I';如果没有';t从python代码中选择正确的退出状态,shell,makefile,Shell,Makefile,我制作了一个这样的makefile,if循环和退出都可以正常工作,但两个部分都没有回声。 你能告诉我为什么吗?你感到困惑和误解了make,所以可能要花几个小时阅读你的文档。请了解在make时间发生了什么,以及make配方中发生了什么(操作由您的shell解释,而不是由make解释;shell由make运行) ifeq很少有用,在“解析”时(当make程序读取您的Makefile时)起作用。它在某种程度上类似于C代码中的#if,即要求make跳过一些输入。您不应该在您的情况下使用ifeq,或者当您
makefile
,if
循环和退出都可以正常工作,但两个部分都没有回声。
你能告诉我为什么吗?你感到困惑和误解了
make
,所以可能要花几个小时阅读你的文档。请了解在make
时间发生了什么,以及make
配方中发生了什么(操作由您的shell解释,而不是由make
解释;shell由make
运行)
ifeq
很少有用,在“解析”时(当make
程序读取您的Makefile
时)起作用。它在某种程度上类似于C代码中的#if
,即要求make
跳过一些输入。您不应该在您的情况下使用ifeq
,或者当您想在运行时更改行为时(当然是make
)
您可能需要一个条件shell命令。阅读bash
(他们使用if
,一个shell关键字)。还可以阅读shell命令中通常缩写为[
的文档,注意它也是一个bash
作为注释,在您的示例中甚至不需要任何条件shell命令。我认为错误消息应该由Python脚本输出,并且它们应该是相关的(因此您最好改进sol.py
脚本)
在Makefile
中,它应该是一个命令,因为Makefile
中的不同shell命令不通信,由make
独立运行。请阅读make
文档的一节
我猜你可能想
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
请注意,您只执行一个shell命令(从上面的python
到endif
),因此除了最后一行之外,每行末尾都需要反斜杠
您可能希望运行make--trace
(和/或make-n
),甚至使用-x
,以了解发生了什么,并调试Makefile
您肯定应该花更多的时间阅读文档
顺便说一句,为什么不将sol.py
Python脚本改为outputGG
或ALL GOOD
?这可能是一个更简单的解决方案,我实际上建议您这样做,并使用bettersol.py
Python脚本。那么您的Makefile
规则应该更简单:
disp:
python sol.py; \
EXIT_STAtus=$$? ; \
if [ "$$EXIT_STAtus" -eq 1 ]; then \
echo "GG"; \
exit 1; \
else \
echo "ALL GOOD"; \
endif
此外,调试生成文件时,应首先删除所有@
,以了解发生了什么
根据经验,避免在Makefile
s中使用@
。一般来说,make
应该详细运行。作为初学者,你永远不应该使用@
。以后你可能会在很少的规则中添加@
(但我不建议这样做)
注意:你第一次为A:
制定的规则也很糟糕(或者至少很难看,很难闻)。您可能至少应该删除@
,如果A
是sol.py
的一个输出,您最好改进sol.py
,使其更为明确,也许在您的第一个配方中有python sol.py>$@
。在分配退出状态后,您可能需要换行吗?@Shelleter GNU make接受了许多建议标准文件名,包括此文件名。用@
屏蔽所有命令是一种可怕的反模式。有一个原因是make
会告诉你它在做什么-把它们拿出来,这样你就可以看到你在做什么(然后可以选择使用make-s
,一旦你正确地调试了它,就可以让它不那么冗长)。如果您有一个大的构建,可能会有选择地将其添加回绝对琐碎的事情,如无条件调试打印。让程序只读取Makefile
文件不是真的。GNU make将按该顺序查找文件GNUmakefile
、Makefile
,并解析找到的第一个文件。或者您可以使用-f
来告诉它读取不同的生成文件。这里介绍了一个处理命令行回显的好技巧:shell的if
和相关条件的目的是运行命令并检查其输出状态。您几乎不需要在中直接检查$?
的值一个条件。您需要if sol.py;然后回显好的东西;否则回显坏的东西;fi
或者在这个小例子中,可能只是sol.py&&echo Good things |{回显坏的东西;退出1;}
…但是仅仅是Make的错误消息可能就足以看出发生了什么错误,因此sol.py&&echo Good things
可能就足够了…或者在Makefile中,简单地sol.py
,然后作为单独shell中配方的下一行,echo Good things
。只有在make
由于上一步的错误而未退出。感谢您的回答,但您的答案是错误的。正确的答案是make在代码运行时立即抛出错误,因此控件将永远不会转到echo语句。您的问题也是错误的。因此,我对一个错误且不清楚的问题给出了可能正确的答案。我的感觉是,您在使用make
时使用的方式与预期不同。
disp:
python bettersol.py