Grep中的退出代码在Makefile中

ale*_*der 9 grep makefile exit-code

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

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

all:
    -grep term log* 
    echo $$?
    @case "$$?" in \
      0)\
    echo "found";; \
    *) \
    echo "not found";;\
    esac;
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 7

a中一系列动作的单独行makefile通常在单独的子shell中执行.要编写您想要的内容,然后:

all:
    if grep term log*; \
    then echo found; \
    else echo not found; \
    fi
Run Code Online (Sandbox Code Playgroud)

这是一个单一的命令; 它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
Run Code Online (Sandbox Code Playgroud)

您可能需要-此时间,因为grep它不是作为shell条件的一部分执行的,非零退出状态可能会触发-e处理.我不建议使用这个.

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

install:  ${PROG}
    cd ${INSTBIN}; ${RM_F} ${PROG}
    ${CP} ${PROG} ${INSTBIN}
    cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG}
Run Code Online (Sandbox Code Playgroud)

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