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}
是的,你可以用不同的方式来做——我是在证明一个观点,而不是提倡一种安装程序的风格。