파일에 패턴이 포함되어 있는지 테스트하고 싶습니다(jasmine 테스트를 건너뛰면 travis에서 실행할 때 빌드가 실패합니다).
나는 이 코드를 가지고 있습니다 :
skipped_tests:
$(if $(shell grep -E 'iit|ddescribe' spec/terminalSpec.js), @false, @true)
grep
문제는 패턴과 일치하는 행을 찾았을 때 출력이 없다는 것입니다. travis 빌드 로그에서 어떤 라인이 문제를 일으키는지 확인할 수 있도록 하고 싶습니다. 명령 오류 코드를 반전시키는 방법이 있습니까(0이 아닌 값이 반환되면 0을 반환하고 그 반대도 마찬가지)?
나는 또한 이것을 시도했습니다 :
skipped_tests:
grep -E 'iit|ddescribe' spec/terminalSpec.js
@test $$? -eq 0 # should it be -ne
그러나 이는 실패했지만 실패하지 않은 한 줄을 에코하며 iit
해당 줄을 찾을 수 없으면 grep은 실패합니다.
答え1
이건 어때?
skipped_tests:
@! grep -E 'iit|ddescribe' spec/terminalSpec.js
答え2
grep을 두 번 호출하여 문제를 해결했습니다.
skipped_tests:
@grep -E 'iit|ddescribe' spec/terminalSpec.js || true
$(if $(shell grep -E 'iit|ddescribe' spec/terminalSpec.js), @false, @true)
더 좋은 방법이 있나요?
나는 몇 가지 다른 것을 시도했지만 grep의 출력이 소스 라인인 경우 다른 가능한 솔루션에서 제공하는 구문 오류가 발생했기 때문에 make가 문자열에서 작동하는 것 같습니다(str.replace 또는 Makefile의 다른 항목 사용).
答え3
가능한 해결책:
상단에서 변수를 정의 Makefile
하고 를 사용합니다 ifeq
.
RESULT = $(shell grep ... 2>/dev/null && echo 0 || echo 1)
. . .
skipped_tests:
ifeq ($(RESULT),0)
. . .
endif
하지만 Skipped_tests가 호출되지 않더라도 grep
호출될 때마다 실행됩니다. make
해당 대상이 매번 호출되면 솔루션이기도 합니다.
당신의 희망을 고려하십시오. grep
대상의 결과를 여러 번 사용 하려면 여러 줄 표현식을 사용할 수 있습니다. 다음이 있다고 가정 해 봅시다 Makefile
.
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
test.js
같은 디렉토리에 다음 항목이 있습니다 .
$ cat test.js
pattern
패턴이 일치하지 않으면 다음 결과가 나타납니다.
$ make
Makefile test.js
패턴이 존재하면 다음 결과가 나타납니다.
$ make
Grep result: pattern
Makefile test.js
Grep result: pattern
가독성을 위해 ``
를 사용하여 변경할 수 있습니다 res=$$(grep -E ...) || ...
.
물론, 하나의 시스템 호출에서 여러 줄의 명령을 실행하는 것은 그다지 편리하지 않지만(여러 줄은 인터프리터의 한 세션입니다) 때로는 변수(환경 변수이기도 함)를 조작해야 하는 상황에서 유용할 수 있습니다.