makefile - framework - tutorial django
Codigos de salida de Grep en Makefile (1)
Las líneas separadas de una serie de acciones en un makefile
normalmente se ejecutan en subcajas separadas. Para codificar lo que buscas, entonces:
all:
if grep term log*; /
then echo found; /
else echo not found; /
fi
Ese es un solo comando; prueba el estado de salida de grep
directamente. Tenga en cuenta el uso liberal de punto y coma; eso es necesario porque todo se aplana cuando pasa al caparazón. Tenga en cuenta también que el -
no es necesario; la instrucción como un todo sale con el estado 0 porque uno de los comandos de echo
se ejecuta, tiene éxito, y ese es el estado devuelto por el subconjunto. Pero hay otra parte del truco; IIRC, el script se invoca con /bin/sh -e
para que el script salga en el primer estado de error (distinto de cero) de un comando de shell, excepto en condicionales explícitos, como un if
.
Si desea capturar explícitamente el estado de grep
(solo para asegurarse de que se está haciendo bien), entonces:
all:
-grep term log*; /
status=$$?; echo $$status; /
if [ $$status = 0 ]; /
then echo found; /
else echo not found; /
fi
Probablemente necesite el -
esta vez porque el grep
no se ejecuta como parte de un shell conditional y un estado de salida distinto de cero podría desencadenar el procesamiento -e
. No recomiendo futzing con esto.
Puede observar que puede hacer comandos de cd
en una acción y porque cada acción se ejecuta por separado, tiene que hacerlo de manera repetida.
install: ${PROG}
cd ${INSTBIN}; ${RM_F} ${PROG}
${CP} ${PROG} ${INSTBIN}
cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG}
Sí, puedes hacerlo de manera diferente: estoy demostrando un punto, no abogando por un estilo de instalación de programas.
Me gustaría comprobar el resultado de una búsqueda grep en un Makefile. Al contrario de esta solución , no deseo usar el comando de shell. Además, no quiero que el Makefile genere un error cuando grep no encuentra la cadena (el código de salida de 1 se trata como un error).
A continuación, intenta ignorar el error y verificar el código de salida:
all:
-grep term log*
echo $$?
@case "$$?" in /
0)/
echo "found";; /
*) /
echo "not found";;/
esac;
Desafortunadamente, el código de salida siempre es 0.