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脚本改为output
GG
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