9

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

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

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

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

4

1 回答 1

7

a 中一系列动作的单独行makefile通常在单独的子 shell 中执行。要编码你所追求的,然后:

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

那是一个命令;它直接测试退出状态grep。注意分号的自由使用;这是必要的,因为它在传递到外壳时都会变平。还要注意,-不需要;该语句作为一个整体以状态 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}

是的,你可以用不同的方式来做——我是在证明一个观点,而不是提倡一种安装程序的风格。

于 2012-10-25T13:11:57.517 回答