我想在Makefile中检查grep搜索的结果。与this solution相反,我不希望使用shell命令。 另外,当grep找不到字符串时,我不希望Makefile引发错误(退出代码为1被视为错误)。
以下尝试忽略错误并检查退出代码:
all:
-grep term log*
echo $$?
@case "$$?" in \
0)\
echo "found";; \
*) \
echo "not found";;\
esac;
不幸的是,退出代码始终为0.
答案 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}
是的,你可以采用不同的方式 - 我正在展示一个观点,而不是提倡安装程序的方式。