¿Qué tal esto?
skipped_tests:
@! grep -E 'iit|ddescribe' spec/terminalSpec.js
He resuelto el problema llamando a grep dos veces
skipped_tests:
@grep -E 'iit|ddescribe' spec/terminalSpec.js || true
$(if $(shell grep -E 'iit|ddescribe' spec/terminalSpec.js), @false, @true)
¿hay una mejor manera?
Probé algunas otras cosas, pero parece que make está operando en cadenas (use str.replace en Makefile o algo así )porque si la salida de grep es una línea de código fuente, da un error de sintaxis de otro posible soluciones.
Posible solución:
Defina la variable en la parte superior de Makefile
y use ifeq
. Por ejemplo:
RESULT = $(shell grep... 2>/dev/null && echo 0 || echo 1)
...
skipped_tests:
ifeq ($(RESULT),0)
...
endif
Pero grep
se ejecutará en cada llamada de make
, incluso si las pruebas omitidas _no están llamando. Si ese objetivo se llama cada vez, entonces también es una solución.
Teniendo en cuenta sus deseos. Si desea usar el resultado grep
en el objetivo varias veces, puede usar una expresión de varias líneas. Supongamos que tengo el siguienteMakefile
:
all: target
target:
@res=`grep -E 'test|pttern' test.js` || { res="" ; : ; } ; \
[ ! -z "$$res" ] && echo "Grep result: $$res" ; \
ls ; \
[ ! -z "$$res" ] && echo "Grep result: $$res" ; \
:
.PHONY: target
y tengo el siguiente test.js
en el mismo directorio:
$ cat test.js
pattern
Si el patrón no coincide, habrá el siguiente resultado:
$ make
Makefile test.js
Si el patrón existe, habrá el siguiente resultado:
$ make
Grep result: pattern
Makefile test.js
Grep result: pattern
Para facilitar la lectura, puede cambiar ``
con res=$$(grep -E...) ||...
.
Por supuesto, no es muy conveniente hacer comandos multilínea en una llamada al sistema (esta multilínea es una sesión de intérprete )pero a veces puede ser útil en casos en los que necesita operar una variable (variable de entorno también ).