Makefileでエラーコードを反転する方法

Makefileでエラーコードを反転する方法

파일에 패턴이 포함되어 있는지 테스트하고 싶습니다(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 ...) || ....

물론, 하나의 시스템 호출에서 여러 줄의 명령을 실행하는 것은 그다지 편리하지 않지만(여러 줄은 인터프리터의 한 세션입니다) 때로는 변수(환경 변수이기도 함)를 조작해야 하는 상황에서 유용할 수 있습니다.

関連情報