如何在makefile中获取bash命令的退出状态?
问题描述:
我有一个Makefile这样的:如何在makefile中获取bash命令的退出状态?
k:
status=$(shell ./x.sh;echo $?)
ifeq ($(status),0)
echo success
else
echo failure
exit 1
endif
x.sh
是简单的脚本,打印数字1到10。
所以,当我运行make:
[email protected]:$make k
status=1 2 3 4 5 6 7 8 9 10
/bin/sh: 1: 2: not found
Makefile:2: recipe for target 'k' failed
make: *** [k] Error 127
在这里,我得到的输出脚本而不是$?
。而当我在ifeq
status
中比较值为空。
我该如何获得这项工作?另外我该如何使用.ONESHELL指令?如果出现问题,我是否可以退出制作而不是执行以下指令:exit 1
?
答
GNU make的配方通常由/bin/sh
执行,这意味着构造语法的ifeq
构造不起作用。
现在坏消息:你试图做的通常是一个坏主意。在GNU make中使用shell变量很可能会破坏你的程序。使用外壳条件会将其颈部折断。
我会在你的情况
k:
./x.sh
@echo Success!
如果./x.sh失败怎么办(即具有非零退出状态),让会自行停止。如果你迫切需要的退出状态,我发现这是工作:
k:
-./x.sh
@echo [email protected]
一些解释:
通常make
将打印它执行的每一行。该行在该行停止之前为@
。 通常,make
将以非零退出状态执行时停止。在一条线将停止之前,-
。
编辑:在你的代码中的错误是由该行造成的 - >
status=1 2 3 4 5 6 7 8 9 10
刚刚尝试在shell中运行它。你可以用单引号或双引号把它括起来,但就像我说的,你试图做的是非常“un make
ly”。