为makefile变量分配标准的退出状态

我正在尝试将命令的标准退出状态保存在我的makefile变量中,但我不知道该如何做。
我已经尝试了这个方法:
pruebas:
    @A= $(ls)

...但是它不起作用。

1个回答

你可以通过使用$(shell command)语法在Makefile中从shell执行命令。 例如,如果你想要在bash中获取ls命令的退出状态,你可以输入:
ls --qwfpgjl > /dev/null 2>&1 ; echo $?

这可能需要一些解释:`> /dev/null 2>&1` 这部分将标准输出和标准错误重定向到 `/dev/null`,所以你看不到任何输出,然后 `echo $?` 打印出最后一个命令的退出状态。你可以在命令行中尝试一下,看看是否适用于你,例如:
ls --qwfpgjl > /dev/null 2>&1 ; echo $?

应该给你
2

因为这是当有未知参数时ls返回的错误(请参阅ls man page)。

现在如何将其包含在您的Makefile中?只需添加以下行:

A=$(shell ls > /dev/null 2>&1 ; echo $$?)

将以下内容添加到您的Makefile中。请注意$$?中的额外$,它告诉make这不是Makefile中的一个变量。
就是这样!在这里,您可以看到我用来测试此行为的Makefile:
#SHELL := /bin/bash
A=$(shell ls > /dev/null 2>&1 ; echo $$? )

test:
    @echo $A
.PHONY: test

注意:
make 默认选择 /bin/sh 作为 shell,但你可以通过设置来覆盖这个选择。

SHELL := /bin/bash

这对于那些在/bin/sh中无法执行的更复杂的命令非常有用。