如何在makefile中获取bash命令的退出状态?

时间:2016-01-06 12:07:30

标签: bash makefile

我有一个像这样的Makefile:

k:
        status=$(shell ./x.sh;echo $?)
        ifeq ( $(status),0)
                   echo success
        else
                   echo failure
                   exit 1
        endif

x.sh是打印数字1到10的简单脚本。

所以当我执行make:

ramana@Ramana:$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指令?如果出现问题,我是否可以真正退出make,而不是使用exit 1执行以下说明?

1 个答案:

答案 0 :(得分:0)

GNU make的配方通常由/bin/sh执行,这意味着ifeq构造(即make语法)不起作用。

现在是坏消息:你试图做的通常是一个坏主意。在GNU make中使用shell变量很可能会破坏你的程序。使用shell条件会使其颈部突然出现。

在你的情况下我会做什么

k:
    ./x.sh
    @echo Success!

如果./x.sh失败(即退出状态为非零),make将自行停止。如果您迫切需要退出状态,我发现这有效:

k:
    -./x.sh
    @echo $$@

一些解释:

通常make将打印它执行的每一行。在该行停止之前@。 通常make如果以非零退出状态执行则会停止。行前的-会阻止该行。

编辑:代码中的错误是由该行引起的 - >

status=1 2 3 4 5 6 7 8 9 10

尝试在shell中运行它。你可以将它用单引号或双引号括起来,但就像我说的那样,你试图做的事情非常“不make”。