명령이 실패하면 만들기를 중단하지 말고 종료 상태를 확인하십시오.

명령이 실패하면 만들기를 중단하지 말고 종료 상태를 확인하십시오.

나는 명령이 실패하더라도 GNU Make 3.81이 멈추지 않도록 지시하려고 합니다(그래서 명령 앞에 를 붙였습니다 -). 그러나 또한 다음 명령의 종료 상태를 확인하고 더 많은 정보를 인쇄하고 싶습니다. 하지만 아래 Makefile은 실패합니다.

$ cat Makefile 
all:
    -/bin/false
    ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!

위의 Makefile이 "실패!" 대신 "성공!"을 에코하는 이유는 무엇입니까?

고쳐 쓰다:

허용되는 답변을 따르고 확장하면 다음과 같이 작성됩니다.

failure:                                                                                                                                                                                                                                      
    @-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"                                                                                                                                                                 
success:                                                                                                                                                                                                                                      
    @-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"     

답변1

규칙의 각 업데이트 명령은 Makefile별도의 셸에서 실행됩니다. 따라서 이전에 실패한 명령의 종료 상태는 포함되지 않으며 $?새 셸의 기본값입니다. $?이것이 바로 [ $? -eq 0 ]테스트가 항상 성공하는 이유입니다.

답변2

0 이면 작동하고 반환 값이 0이 아니면 계속 진행하기 $?때문에 테스트할 필요가 없습니다 .&&$?||

그리고 make의 반환 값은 해당 라인의 마지막 진행 호출에서 가져오기 때문에 빼기 기호가 필요하지 않습니다. 그래서 이것은 훌륭하게 작동합니다

실패하다:

      @/bin/false && echo "success!" || echo "failure!" 

성공:

      @/bin/true && echo "success!" || echo "failure!"

반대의 경우가 발생합니다. 자신만의 메시지를 실행하고 0이 아닌 값으로 make 프로세스를 중단하려면 다음과 같이 작성해야 합니다.

실패하다:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }

답변3

~에서GNU make 문서:

"-" 또는 "-i" 플래그로 인해 오류를 무시해야 하는 경우,make는 오류 반환을 성공으로 처리합니다.단, 셸이 종료되었을 때 상태 코드를 알려주고 오류가 무시되었음을 나타내는 메시지를 인쇄한다는 점만 다릅니다.

make이 경우 종료 상태를 이용 하려면 make스크립트에서 실행하십시오.

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

그리고 Makefile에 다음을 포함시키십시오:

all:
    /bin/false

답변4

이것이 내가 한 일입니다.

.PHONY: test-cleanup
test-cleanup:
    $(eval CLEANUP = echo "Some cleanup procedure")
    @/bin/true && touch _testok || $(CLEANUP) ;\
    if [ -f "_testok" ]; then \
        rm -f _testok ;\
        echo "What a success!" ;\
    else \
        echo "Failure :-(" ;\
        exit 1 ;\
    fi

다음을 인쇄합니다.

What a success!

/bin/true로 변경하면 /bin/false다음과 같은 결과가 출력됩니다.

Some cleanup procedure
Failure :-(
make: *** [Makefile:4: test-cleanup] Error 1

관련 정보