Grep中的退出代码在Makefile中

时间:2012-10-25 12:03:05

标签: makefile grep exit-code

我想在Makefile中检查grep搜索的结果。与this solution相反,我不希望使用shell命令。 另外,当grep找不到字符串时,我不希望Makefile引发错误(退出代码为1被视为错误)。

以下尝试忽略错误并检查退出代码:

all:
    -grep term log* 
    echo $$?
    @case "$$?" in \
      0)\
    echo "found";; \
    *) \
    echo "not found";;\
    esac;

不幸的是,退出代码始终为0.

1 个答案:

答案 0 :(得分:7)

makefile中一系列操作的单独行通常在单独的子shell中执行。要编写您想要的内容,请:

all:
    if grep term log*; \
    then echo found; \
    else echo not found; \
    fi

这是一个单一的命令;它直接测试grep的退出状态。注意自由使用分号;这是必要的,因为它在传递给shell时会变得扁平。另请注意,不需要-;整个语句以状态0退出,因为其中一个echo命令被执行,成功,这是从子shell返回的状态。但是这个伎俩的另一部分; IIRC,使用/bin/sh -e调用脚本,以便脚本从shell命令退出第一个错误(非零)状态 - 除了if等显式条件。

如果您想明确捕获grep的状态(如果只是为了确保它正确完成),那么:

all:
    -grep term log*; \
    status=$$?; echo $$status; \
    if [ $$status = 0 ]; \
    then echo found; \
    else echo not found; \
    fi

这次可能需要-,因为grep不会作为shell条件的一部分执行,非零退出状态可能会触发-e处理。我不推荐这个。

您可能会注意到,您可以在操作中执行cd命令,并且因为每个操作都是单独执行的,所以您必须重复执行。

install:  ${PROG}
    cd ${INSTBIN}; ${RM_F} ${PROG}
    ${CP} ${PROG} ${INSTBIN}
    cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG}

是的,你可以采用不同的方式 - 我正在展示一个观点,而不是提倡安装程序的方式。